メインプロセスによって生成されたプロセスの終了コードを取得します。

メインプロセスによって生成されたプロセスの終了コードを取得します。

run-jobs子プロセスで別のタスクを開始する基本プロセス(下)があります。基本プロセスが失敗した場合(データベースの失敗など)、ゼロ以外のステータスコードで終了します。これは問題ではなく、$?変数()を見ると確認できますecho $?

ただし、メインタスクが失敗した場合に備えて、子プロセスの終了コードも確認したいと思います。process_1基本プロセスが消えた後に次の終了コードを確認する便利な方法はありますか?process_2

これは次の単純化された出力ですps auxf

vagrant 5167 | \_ php app/console run-jobs vagrant 5461 | \_ php process_1 vagrant 5517 | \_ php process_2

答え1

親がID 1()のプロセスに対して終了した場合、プロセスは終了ステータスを親に報告しますが、init最新バージョンのLinux(3.4以降)では、他の祖先を次のように指定できます。子供用収穫機この役割の場合(使用prctl(PR_SET_CHILD_SUBREAPER)

効果的にプロセスが終了すると、親プロセスがinit終了状態(withwaitpid()またはother)を取得するまでゾンビプロセスになります。

あなたの場合、あなたは子供たちが死後(?)死を迎えていると言っていますrun-jobs。これは、init子リッパーで指定されたプロセスに終了状況を報告することを意味します。

これを記録せずinit(通常は記録しない)、監査アカウントまたはプロセスアカウントを使用しないと、終了ステータスは失われます。

最新バージョンのLinuxでは、独自のサブハーベスタを作成して、これらの孤立プロセスのpidと終了ステータスを取得できます。良いperl

$ perl -MPOSIX -le '
  require "syscall.ph";
  syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!";

  # example running 1 child and 2 grand children:
  if (!fork) {
    # There, you would run:
    # exec("php", "run-jobs");
    if (!fork) {exec "sleep 1; exit 12"};
    if (!fork) {exec "sleep 2; exit 123"};
    exit(88)
  }
  # now reporting on all children and grand-children:
  while (($pid = wait) > 0) {
   print "$pid: " . WEXITSTATUS($?)
  }'
22425: 88
22426: 12
22427: 123

死んだプロセス(コマンドライン、ユーザー、ppidなど)に関する情報を取得するには、そのプロセスがまだゾンビ状態にある間、つまりそのプロセスに対して作業を実行するwait()前にこれを実行する必要があります。

これを行うには、waitid()オプションでAPIを使用する必要があります(その後、コマンドWNOWAITから情報を取得する必要があります)。インターフェイスがないようです。/procpsperlC

関連情報