複数のプロセスに類似した PID 番号がある場合、特定の PID 値を 1 つ選択するにはどうすればよいですか?

複数のプロセスに類似した PID 番号がある場合、特定の PID 値を 1 つ選択するにはどうすればよいですか?

私は RHEL 7.5 を使用しており、PID 番号を含むファイルを含む Java プログラムがあります。プロセスが強制終了されても、ファイルは引き続き存在するため、そのファイルに保存されている PID が生きているかどうかを検証するスクリプトを実行していますが、疑問や問題があります。

PID 445 と 2445 が存在します。では、445 だけを取得するにはどうすればよいでしょうか?

次のコマンドを試しました:

ps -ax | egrep "^ 445"

しかし、何も返ってきませんでした。

2 つのプロセス:

ps -ax | grep -v grep | egrep "445"

  445 pts/2    Sl     3:50 /opt/
 2445 ?        S      0:00 dbus-launch

答え1

使用-p

-p proclist
プロセス ID 番号が指定されているプロセスの情報を書き込みますproclist。 […]

ソース

あなたの場合:

ps -p 445

POSIXではps、「エラーが発生した」場合は肯定的な終了ステータスを返す必要があるとpsされています。私がテストしたすべてのproclistケースでは、既存 処理を「エラー」として処理します。これは便利です。例:

ps -p 445 >/dev/null && echo "Process exists."

ノート:

答え2

次のようにして、Bash スクリプトでプロセスが実行中かどうかを確認できますkill -0

if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
  exit
else
  rm -rf ${pid_file}
  exit
fi

${pid_file}、PID を含むファイル パスに相当します。 は、-f ${pid_file}PID ファイルが存在するかどうかを確認します。 次に、kill -0 $(cat ${pid_file})プロセスが実行中かどうかを確認します。

つまり、次のようになります。

  • プロセスが実行中の場合は、スクリプトを終了するだけで何もしません。
  • それ以外の場合(プロセスがない実行中の場合は、PID ファイルを削除するだけです。

の魔法については、kill -0manページで説明されています。kill:

もし署名0 の場合、シグナルは送信されませんが、エラー チェックは実行されます。これを使用して、プロセス ID またはプロセス グループ ID の存在を確認できます。

関連情報