1

关于我正在编写的初始化脚本,我有几个问题。我以前实际上没有从头开始做,所以可能有几个我不知道的技巧和窍门。此外,shell 脚本不是我经常使用的东西,因此语法需要一些时间来适应。

首先,我有一个功能来查看应用程序是否正在运行。这样做的原因,而不是锁文件或类似的,是我只想要一个实例并且应用程序有点错误,即使主应用程序被杀死,插件有时也会徘徊。

所以我有类似的东西。

isrunning() {
  pids=`ps aux | grep -e 'FooBar' | grep -v grep | awk '{print $2}'`
  if [ ! -n "$pids" ]; then
    return 1
  else
    return 0
  fi
}

有没有更好的办法?

我启动主应用程序

daemon --user apache "./FooBar"

但这将脚本执行挂在该行上,直到FooBar终止。

daemon --user apache "FooBar&"

虽然有效。但是看起来运行init脚本时显示的[OK] / [FAILED]实际上是由daemon函数输出的?所以即使执行失败,由于FooBar的进程被分离, daemon仍然会报告[OK] 。

有没有办法让守护进程在不分离进程的情况下不会卡住?我已经尝试过-d选项等,但没有运气。

否则我只想做一个sleep 3然后检查isrunning工作正常。但是后来我不知道如何以初始化脚本通常所做的漂亮方式打印[OK ] / [FAILED]消息。也许有一种功能可以用来以标准形式打印它?

更新

我找到了打印消息的解决方案。看来它实际上是为此的功能。 成功失败将打印消息。

守护进程问题仍然存在。有什么办法摆脱&

更新 2

我找到了解决方法并使用了

su -m -c "./FooBar&" apache

并检查应用程序是否在此之后运行。根据结果​​,我打印正确的消息。

4

2 回答 2

1

我找到了打印消息的解决方案。看来它实际上是为此的功能。成功和失败将打印消息。

于 2011-08-31T13:44:16.167 回答
1

您使用的脚本是常见问题解答的错误答案。试试这个更简单的版本:

isrunning () {
  pids=`ps aux | awk '/FooBar/{print $2}'`
  if [ ! -n "$pids" ]; then
    return 1
  else
    return 0
  fi
}

我也很想从 awk 中设置退出代码:

isrunning () { ps aux | awk '/FooBar/{print $2;exit 0}END{exit 1}'; }

不过,如果您使用的是 Linux,也许您应该pidof改用它。

于 2011-08-24T11:05:44.267 回答