Debianのプロセス監視

Debianのプロセス監視

特定のプロセスの存在を監視するサービスを作成したいと思います。次のシェルスクリプトを作成しました。

#!/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を消してプロセスを開始します。ONプロセスの実行中にLEDが点灯する必要があります。

次に、次の行を追加してこのスクリプトを実行します/etc/rc.local

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

実行してみると、プロセスがあるpsことがわかります。XR50_endpoint_m &

マイコンピュータは、Debianを実行するリソースが制限された(組み込み)ALIXボードです。

問題は
変数が$w常に0であることです(出力ファイルでこれを確認しました/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`

関連情報