从自定义init.d脚本输出标准的OK / FAILED消息

时间:2011-08-24 07:38:28

标签: daemon sh init.d

关于我正在编写的init脚本,我有几个问题。我之前并没有从头开始这么做,所以可能有一些我不知道的提示和技巧。另外,shell脚本不是我经常使用的东西,所以语法花了一些时间来习惯。

首先,我有一个函数来查看应用程序是否正在运行。其原因,而不是 lockfiles 或类似的原因是我只想要一个实例,而且应用程序有点错误,即使主应用程序被杀死,插件也有时会延续。

所以我有类似的东西。

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] 实际上是由守护程序函数输出的?因此,即使执行失败,守护程序仍会报告 [确定] ,因为分离了 FooBar 的过程。

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

否则我只想做一个睡眠3 ,然后检查 isrunning 哪个正常。但后来我不知道如何以init脚本通常做的漂亮的方式打印 [OK ] / [FAILED] 消息。是否有一个可以用来以标准形式打印的功能?

更新

我找到了打印邮件的解决方案。它似乎实际上是这个功能。 成功失败会打印消息。

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

更新2

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

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

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

2 个答案:

答案 0 :(得分:1)

我找到了打印邮件的解决方案。它似乎实际上是这个功能。成功和失败将打印消息。

答案 1 :(得分:0)

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

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代替。