pid $$を指定してプロセスの終了をリッスンします


14

pidを持っているとしましょう。 mypid=$$

指定されたpidでそのプロセスの終了をリッスンするために使用できるbash /システムコマンドはありますか?

mypidのプロセスが存在しない場合、コマンドは単に失敗するはずです。


私はC#を使用していませんが、明らかに方法があるはずです:msdn.microsoft.com/en-us/library/fb4aw7b8(v
Alexander Mills

Unixでは、シェルまたはCライブラリ関数を使用して子プロセスを待つのが一般的です。AFAIKには、非子プロセスを待つ標準的な方法はありません。C#関数がそれを実行できるかどうかはさらに不明確です(「関連プロセス」が何であるかに依存します)。waitwait()
クサラナンダ

私は投票でこれを行うことができましたが、それはひどいでしょう
Alexander Mills

また、誤った結果をもたらす可能性もあります。PIDの再利用とは、理論的には、プロセスが待機しているプロセスと同じPIDで動作する可能性があることを意味します。Linux(順次PIDを使用)では、これは起こりそうにありませんが、OpenBSD(ランダム化PID割り当て)などのシステムでは問題になります。
Kusalananda

回答:


19

私はこの答えから必要なものを手に入れました:https//stackoverflow.com/a/41613532/1223975

.. wait <pid> そのpidが現在のプロセスの子プロセスである場合にのみ機能します

ただし、以下はすべてのプロセスで機能します。

プロセスが完了するのを待つ

Linux:

tail --pid=$pid -f /dev/null

ダーウィン($pid開いているファイルが必要です):

lsof -p $pid +r 1 &>/dev/null

タイムアウトあり(秒)

Linux:

timeout $timeout tail --pid=$pid -f /dev/null

ダーウィン($pid開いているファイルが必要です):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

Linuxとは関係なく、GNUテールの機能です。したがって、GNU / LinuxのようなGNUテールを備えたシステムでは機能し、GNU以外のLinuxベースのシステムでは機能しません。
ステファンChazelas

この場合、tail / lsofがポーリングを使用するのではないかと心配しています。少なくとも、MacOSでそのように表示される経験的な証拠があります。
Alexander Mills

リピートモードでのlsof + Rプットそれを、それがポーリングを使用していますので、そのコマンドは、いまいましい秒ごとに繰り返しているので
アレクサンダー・ミルズを

3

組み込みのbashを使用できますwait

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

システムコールを使用しますwaitpid()

$ whatis waitpid
waitpid (2)          - wait for process to change state

うまくいきました。うまくいけば、フードの下でポーリングを使用しないでください、ありがとう!
Alexander Mills

1
:ええ、私のユースケースのために、私はこのエラーを取得する動作しませんbash: wait: pid 47760 is not a child of this shell...製図板に戻って大爆笑
アレクサンダー・ミルズ

私は答えがあります、それをthxに投稿しました
Alexander Mills

1
これは子プロセスのみを待機し、現在のプロセスに関連付けられていないプロセスは待機しません。
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.