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
から情報を取得する必要があります)。インターフェイスがないようです。/proc
ps
perl
C