プロセスが実行されているかどうかを自動的に確認しようとしており、それに応じて次の手順を実行する必要があります。bash スクリプトを作成しましたが、機能していないようです。
if ps aux | grep [M]yProcessName > /dev/null
then
echo "Running"
else
echo "Not running"
fi
私のif
発言は間違って使用されていますか?
特定のプロセス (既知の pid のプロセス) が実行されているかどうかは知りたくありませんが (これは/proc/1234/
、pid 1234 の存在するかどうかをテストすることで確認できます)、特定のコマンド (または特定の実行可能ファイル) を実行しているプロセスがあるかどうかは知りたくないでしょう。
kill(2)システムコールは、特定のプロセスが実行されているかどうかを確認するために移植可能に使用できることに注意してください (例: 0 シグナルkill(pid,0)
)。これは、プログラム内から、既知の pid のプロセスがまだ存在し、実行中 (または待機中) であることを確認する一般的な方法です。
このコマンドを使用して、pidof
実行可能ファイルを実行しているプロセスを見つけることができます。たとえばpidof zsh
、すべてのzsh
プロセスを見つけることができます。使用することもできますkillall -s 0 zsh
pgrep
また、ユーティリティと/proc
ファイルシステムに興味があるかもしれません。
ps aux | grep [M]yProcessName | grep -v grep
解決策があります:
if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then ... elif [ ... ]; then ... else ... fi
これは Debian 6 で問題なく動作します。'{print $11}' が必要です。これは、システムが grep もプロセスとして扱うためです。
processid =$(ps aux | grep 'ProcessName' | grep -v grep| awk '{print $2}')
上記のコマンドは、プロセス ID を提供します。そのプロセスIDを変数に割り当てて、これを行います -->
if cat /proc/$processid/status | grep "State: R (running)" > /dev/null
then
echo "Running"
else
echo "Not running"
fi
-zを使用して文字列が空かどうかを確認すると、次のように機能する可能性があります。
line=$(ps aux | grep [M]yProcessName)
if [ -z "$line" ]
then
echo "Not Running"
else
echo $line > /dev/null
echo "Rinnung"
fi
私のシステムでは、ps aux | grep ProcessName
常に次のようなgrepプロセスの行を取得します。
edw4rd 9653 0.0 0.0 4388 832 pts/1 S+ 21:09 0:00 grep --color=auto ProcessName
したがって、終了ステータスは常に0です。おそらくそれがスクリプトが機能しない理由です。
戻り値 0 は成功を意味し、他は失敗しました
kill -0 `pid`; echo $?
この回答が暗示している方法を明示的に言及することpgrep
は、プロセス名でこれを行う最良の方法です。
pgrep [M]yProcessName
名前が "[M]yProcessName" に一致するプロセスが実行中の場合、pgrep
はその PID を stdout に出力し、 code で終了します0
。それ以外の場合は、何も出力せず、 code で終了します1
。
これを試して
ps aux | grep [M]yProcessName | grep -v grep