pid
以下では、実行中のプロセスを抽出して現在のプロセスを確認しようとしましたppid
ps -p 1111 -o ppid = $(ps -eo pid,args | awk '/PRD_/ && /startscen\.sh/ && $8 ~ /<string>/' | awk -F" " '{print $1}')
私のスクリプトは間違っています。より良い方法はありますか?
特定のプロセスの ppid を確認するには、次のような表記を使用します。
$ ps -p 1111 -o ppid=
これはあなたが得たものに近いですが、等号が の直後に ppid
あり、スペースがないことに注意してください。この等号は式の一部ではありません-o
。オプションを使用したその機能は、カスタム ヘッダーを指定することです。私が含めたこの例では、ps にヘッダーをまったく含めないように指示しているため、出力は ppid だけで他には何もありません。たとえば、 を試してくださいps -p 1 -o ppid=Hello
。
これを正しく読んでいる場合、残りのコード例は実際の質問とは無関係のように見え、おそらく実行中のシェル スクリプトの pid を収集しようとしています。したがって...この回答の補足として、この点に関する私のアドバイスは、シェルスクリプトを変更して、それ自体をどこかに記録するようにすることです。そのため、プロセステーブルを解析して見つける必要はありません。たとえば、startscen.sh
次のようなものを上部近くに追加できます。
pidfile="/var/run/`basename $0`.pid"
if [ -s "$pidfile" ]; then
if ps "$(cat $pidfile)" >/dev/null; then
echo "ERROR: already running, giving up." >&2
exit 1
fi
fi
trap "rm -f pidfile" 0 1 2 3 5 15
echo $$ > $pidfile
完全ではありませんが、これにより、スクリプトを同時に 2 回実行することに対する保護が提供され、実行中のスクリプトの pid が他の pid が存在するファイルに保存されます。
します
ps -ef | awk '/PRD_/ && /startscen\.sh/ {print $3}'
あなたが欲しいものをあなたに与えますか?これは、CMD 文字列に「PRD_」と「startscen.sh」を含むプロセスを検索し、PPID を報告します。親に関する情報を取得するために追加の ps を実行する場合は、
ps -p `ps -ef | awk '/PRD_/ && /startscen\.sh/ {print $3}'`