关于我正在编写的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
并在此之后检查应用程序是否正在运行。根据结果,我打印正确的信息。
答案 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
代替。