どのアプリケーションでも、ps を使用して、Unix シェル自体を使用してプロセス ID を見つけることができます。以下の例は、ps からの非常に縮小されたリストです。PS は、PID だけでなく、所有者と親プロセス ID (この特定のプロセスを開始したプロセス) も表示します。
userX# ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Oct19 ? 00:00:00 /sbin/init
root 2 0 0 Oct19 ? 00:00:00 [kthreadd]
root 3 2 0 Oct19 ? 00:00:02 [migration/0]
root 4 2 0 Oct19 ? 00:04:48 [ksoftirqd/0]
root 5 2 0 Oct19 ? 00:00:00 [migration/0]
root 6 2 0 Oct19 ? 00:00:00 [watchdog/0]
...
root 27 2 0 Oct19 ? 00:00:00 [pm]
root 28 2 0 Oct19 ? 00:00:00 rsnapshot
root 29 2 0 Oct19 ? 00:00:00 [xenbus]
それでは、どのプロセスが私たちにとって興味深いかを見つけ始めましょう。私は rsnapshot に詳しくないので、例にダミー データを入れました。
userX# ps -ef | grep rsnapshot
root 28 2 0 Oct19 ? 00:00:00 rsnapshot
ec2-user 7233 1497 0 11:32 pts/0 00:00:00 grep rsnapshot
grepのおかげで、「ヘッダー」情報は提供されず、一致する行のみが提供されることに注意してください。2 番目の「列」は PID です。注目すべき点: ps は、実行したばかりの grep を含むすべてのプロセスを表示します。コマンド/スクリプトはこれに注意し、これらの項目を削除する必要があります。次の例では awk を使用してそれを行います。
さらに拡張して、PID をファイルに取得します。PID があることを確認する必要があります。ある場合は、ロック ファイルを作成するコマンドを作成します。
userX# ps -ef | grep rsnapshot | awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}'
echo 28 > rsnapshot.lck
rsnapshot の PID が存在しない場合、出力はありません。書かれているように、awk は各行を確認し、文字列「grep」が含まれておらず、2 番目のフィールドに数字 [0-9] がある場合は、実行するコマンドを出力しますが、実際にはコマンドを実行しません。
最後のステップは、awk 出力からコマンドを呼び出すことです。
userX# ps -ef | grep rsnapshot | awk '$0!~/grep/ && $2~/[0-9]/{print "echo "$2" > rsnapshot.lck"}' | sh
「| sh」を追加すると、すべての出力がコマンドとして呼び出されます。awk が rsnapshot を見つけられない場合、実行するコマンドはありません。