bash子プロセスのPID(imapsync)-どうやって取得しますか?


15

bashで実行されたコマンドのPIDを取得する方法を教えてください。

たとえば、imapsyncを実行するbashスクリプトがあります。

スクリプトが強制終了されると、imapsyncプロセスが常に強制終了されるわけではないため、imapsyncのPIDをスクリプトからプログラムで識別できるようにして、imapsyncプロセスをシグナルハンドラで自分で強制終了できるようにします。

それでは、親bashスクリプトから子プロセスのPIDをプログラムで取得するにはどうすればよいですか?


1
「pidof imapsync」はどうですか?どうしたの?
pitr

2
pidofについては知りませんでした。しかし、今では、このシナリオでは、pidofはシステム上の特定のコマンドのすべてのプロセス(他のスクリプト/ユーザーが所有するものも含む)を返すように見えるため、役に立ちません。さらに、imapsyncは実際にはperlスクリプトなので、pidof perlを実行しますが、これもimapsyncではなく、他のユーザーに属する可能性のあるプロセスを返す可能性があります。
ジェイソンタン

ハビエルは正しいです。このページでは、ProcessManagementに関する詳細情報を提供します。
11

回答:


4

imapsyncには、pidが書き込まれる場所を設定するオプションがあります。

--pidfile:imapsync pidが書き込まれるファイル。


FYIこれは本当に一般的な意味での私の質問に答えていないが、私は--pidfile引数を発見しましたし、その周りにいくつかのfaffingで...これまでのところは良い十分なされている
ジェイソン・タン

@JasonTanなぜ男に魚を教えるのは、彼においしい調理済みの切り身を与えることができるのに、彼が戻って来て、明日、あなたにもっとうなずきますか?古い投稿をすみませんが、なぜJaviersのこの回答を受け入れるのですか?
同期されていない

46
any_command args &
my_child_PID=$!

IOW は、PIDを$$保持するのと同じよう$!に、最後に実行されたバックグラウンドコマンドの PIDを持ちます。


ありがとう、しかしimapsyncはバックグラウンドではなく、$!imapsync呼び出し後の次の行またはシグナルハンドラーの最初の行にエコーする場合は設定されません。:-(
ジェイソンタン

6
子をフォークしてバックグラウンド化する場合、子のPIDをどこかに保存するのは親の責任です。通常の練習はそれをどこかのように保存し/var/run/whatever.pidます。おそらく、PIDをどこかに保存するように要求するコマンドラインオプションがあります。そうでない場合、それは著者に尋ねるか、自分で実装する機能のように聞こえます。
ハビエル

1
背景の強調。バックグラウンドにプロセスが配置されていない場合(つまりが付加されている場合&)、$!変数は未定義です。
トレバー

1
より類似したソリューションは、(開始されたばかりのプロセスのpidを取得する方法への回答)で提案されています。ああ、そして「oneliner」:この回答に加えて、コメントが語る/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 11月24日夜02時28分'10で
IMZ -イワンZakharyaschev

10

とは異なりpidofpgrepPIDを返すプロセスを制限するためのさまざまなオプションを指定できます。特に役立つのは、現在のプロセスのPIDを使用してPPIDに基づいて選択することです。

pgrep -P $$ imapsync

スクリプトの子である場合にのみimapsyncのPIDを出力します。


0

一時的にimapsyncをバックグラウンドに入れ、PIDを取得してからフォアグラウンドにするとどうでしょうか。次のようなものです。

imapsync &
pid=$!
wait $pid
retVal=$?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.