OpenWrtベースのシステムで実行されているプロセスインスタンスの数を確認するスクリプトを作成しました。端末で次のコマンドを実行すると、
COUNT_PS=$(echo `ps -w | grep -v grep | grep upmpdcli | wc -l`)
root@SHAULA-720:~# echo $COUNT_PS
明らかにする
1
以下はシェルスクリプトのコードです。このスクリプトを実行すると、結果は1ではなく4になります。
#!/bin/ash
#for debug
ps -w | grep -v grep | grep upmpdcli
COUNT_PS=$(echo `ps -w | grep -v grep | grep upmpdcli | wc -l`)
echo we have $COUNT_PS instances for upmpdcli;
logger we have $COUNT_PS instances for upmpdcli;
if [[ $COUNT_PS == 1 ]]; then
logger "we have only one instance"
#HERE PUT CODE TO START NEW PROCESS
elif [[ $COUNT_PS == 2 ]]; then
logger "we have 2 instances lets kill all and start a single"
kill -9 `pgrep upmpdcli`
elif [[ $COUNT_PS == 0 ]]; then
logger "we have no instance lets wait for cron to start it"
else
logger "we have $COUNT_PS instances"
fi
だから実行すると/etc/upmpd-check.sh
結果がwe have 4 instances for upmpdcli
奇妙に見えます。
私がここで何を見逃しているのでしょうか?
答え1
主な混乱は、ps | grep
文字列を含むスクリプト名と一致するパイプで発生しますupmpdcli
。
これにより、デフォルトではpgrep
コマンドpgrep
名のみが表示されupmpdcli-check
ますupmpdcli
。
理想的には
pgrep -x /usr/bin/upmpdcli
プロセスのPIDを取得します。
プロセスを終了するには、次のようにします。
pkill -x /usr/bin/upmpdcli
つまり、〜をしなさいいいえPIDを使用してくださいpgrep
(最新バージョンではない可能性があります)。
最も古いupmpdcli
プロセスのみを終了するには、pkill
withを使用し-o
て-n
最新のプロセスのみを終了します。pkill
マニュアルを参照してください。
また参考にしてください
variable=$( echo `somecommand` )
次のように書く方が良いです。
variable=$( some_command )
シェルが結果に基づいてトークン化とファイル名拡張を実行するという事実に依存しない限りsome_command
(ユーザーはそうではありません)。