监控 Debian 中的进程

监控 Debian 中的进程

我想创建一个监视某个进程是否存在的服务。我编写了以下 shell 脚本:

#!/bin/sh
while :
do
w=`ps u -A | grep -P ".+Sl.+/usr/local/MySource/endpoint" -c`
sleep 10
if [ $w -lt 2 ] 
then
echo 0 > /sys/class/leds/alix\:2/brightness
killall -9 /usr/local/MySource/endpoint
nohup /usr/local/MySource/endpoint &> /dev/null &
last_endpoint_m=`date`
echo $last_endpoint_m > /tmp/endpoint_msleep
echo $w >> /tmp/endpoint_msleep
else
echo 1 > /sys/class/leds/alix\:2/brightness
fi
sleep 10
done

如果该进程存在,脚本将关闭我机器上的 LED 并启动该进程。 LED 应该ON在进程运行时亮起。

然后,我通过添加以下行来运行此脚本/etc/rc.local

nohup /usr/local/MyTools/additions/XR50_endpoint_m &> /dev/null &

当我运行时ps,我发现该XR50_endpoint_m &进程就在那里。

我的机器是一个运行 Debian 的资源有限(嵌入式)的 ALIX 板。

问题是:
变量$w始终为零(我从输出文件中验证了这一点/tmp/endpoint_msleep)。尽管该进程存在并且如果我手动运行脚本则工作正常($w=2)!

您认为原因是什么?监控流程的最佳方法是什么?

答案1

它失败了,因为你跑了ps u。从man ps

u 显示面向用户的格式。

这意味着ps只会列出当前用户拥有的进程。当您手动运行脚本时,该用户就是您,因此您的进程会正确列出。

(正如@Gilles非常正确地指出的那样,使用-A将导致所有进程被打印,因此解释是错误的。pgrep不过仍然更好)。


无论如何,更好的方法是使用pgrep

   pgrep,  pkill  - look up or signal processes based on
   name and other attributes

改变

w=`ps u -A | grep -P ".+Sl.+/usr/local/MySource/endpoint" -c` 

w=`pgrep -c endpoint`

相关内容