由于有几个人已经指出,因为ps | grep
检测到(1)脚本本身和(2)反引号创建的子进程,它继承了主脚本的名称,所以您的进程数量被夸大了。所以一个简单的解决方案是将脚本的名称更改为不包含您要查找的名称的名称。但你可以做得更好。
我建议的“最佳实践”解决方案是使用操作系统提供的工具。初始化脚本创建一个PID文件作为启动守护进程的一部分并不罕见;换句话说,不是只运行守护进程本身,而是使用启动守护进程的包装脚本,然后将进程ID写入某个文件中。如果不存在您的系统上start-stop-daemon
(我认为这是这些天很常见),你可以使用像这样:
start-stop-daemon --start --quiet --background \
--make-pidfile --pidfile /var/run/fsdaemon.pid -- /usr/bin/fsdaemon
(显然取代路径/usr/bin/fsdaemon
如适用)来启动它,然后
start-stop-daemon --stop --quiet --pidfile /var/run/fsdaemon.pid
停止它。 start-stop-daemon
还有其他可能对您有用的选项,您可以通过阅读手册页进行调查。
如果您没有访问start-stop-daemon
,你可以写一个包装脚本来执行基本相同的事情,像这样开始:
echo "$$" > /var/run/fsdaemon.pid
exec /usr/bin/fsdaemon
,这阻止:
kill $(< /var/run/fsdaemon/pid)
rm /var/run/fsdaemon.pid
(当然这很粗糙,但它通常应该可以正常工作)。
无论如何,一旦你的设置来生成一个PID文件,是否使用start-stop-daemon
与否,你可以更新你的check脚本来此:
daemon_pid=`ps --no-headers --pid $(< /var/run/fsdaemon.pid) | wc -l`
if [ $daemon_pid -eq 0 ]; then
echo "restarting fsdaemon"
/etc/init.d/fsdaemon restart
fi
(人会想到会有简短的命令检查给定的PID是否正在运行,但我不知道它)。
如果你不想(或不能)创建一个PID文件,我至少会建议pgrep
代替ps | grep
,因为pgrep
将名义直接搜索的过程,并不会发现任何东西,只是恰好包含相同的字符串。
daemon_pid=`pgrep -x -c fsdaemon`
if [ $daemon_pid -eq 0 ]; then
echo "restarting fsdaemon"
/etc/init.d/fsdaemon restart
fi
的-x
手段 “严丝合缝”,并-c
作品与grep
。
顺便说一下,当它实际上是一个计数时,命名变量daemon_pid
似乎有点误导。
只是为了检查显而易见的:脚本文件的名称不包含'fsdaemon',是吗? –
事实上,脚本文件的名称是“check-fsdaemon”。这也许是一个重要的原因(我看到两个)。另一个来自命令行的grep? –
另外,'grep'进程的参数列表中有'fsdaemon'。你可以不用'-c'来验证它。 –