スクリプトで実行している場合、pgrepは端末で実行した場合とは異なる結果を返します。

スクリプトで実行している場合、pgrepは端末で実行した場合とは異なる結果を返します。

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プロセスのみを終了するには、pkillwithを使用し-o-n最新のプロセスのみを終了します。pkillマニュアルを参照してください。


また参考にしてください

variable=$( echo `somecommand` )

次のように書く方が良いです。

variable=$( some_command )

シェルが結果に基づいてトークン化とファイル名拡張を実行するという事実に依存しない限りsome_command(ユーザーはそうではありません)。

関連情報