web-dev-qa-db-ja.com

複数のプロセスを待機し、いずれかのプロセスが終了した場合は終了コードを出力します

私がここで達成しようとしているのは、スクリプトを介して3つの異なるカスタムアプリケーションを同時に実行しているときに、いずれかのアプリケーションが終了した場合に、通知または印刷終了コードを介してアラートを出すことです。

使用中のシステム:Centos 6.8

3
Rakesh.N

バッシュのwait -n、ただし、どの子プロセスが終了したかはわかりません。単純なPerlスクリプトはどうですか?

#!/usr/bin/Perl

use strict;
use warnings;
use POSIX ":sys_wait_h";

sub spawn(@) {
    my $pid = fork();
    die "fork: $!" if not defined $pid;
    if ($pid == 0) {
        exec @_ or die "exec: $!";
    }
    return $pid;
}

# Commands to run
my $p1 = spawn '/bin/bash -c "sleep 6; kill $$"';
my $p2 = spawn '/bin/bash -c "sleep 4; exit 4"';

print "spawned PIDs $p1 and $p2\n";

while ((my $child = waitpid(-1, 0)) > 0) {
    my $code = $? >> 8;
    my $status = $? & 0xff;
    printf "child %d finished with exit code %d (status/sig %d)\n", $child, $code, $status;
}
2
ilkkachu

wait -nを使用して子が終了するのを待ち、次にkill -0で実行されているかどうか各子をテストして、次のように終了したばかりの子を確認できます。

for f in 15 10 15; do sleep $f & PIDS+="$! " ; done ; wait -n ; for f in $PIDS; do if ! kill -0 $f 2> /dev/null ; then echo $f; fi;

wait -nは、子の終了ステータスのみを返し、PIDは返しませんでした。

1
psusi

waitbashコマンドには-nオプション:

-nオプションが指定されている場合、waitはジョブが終了するまで待機し、その終了ステータスを返します。

これはあなたがするかもしれないことを意味します

command1 &
command2 &
command3 &

wait -n
printf 'One command exited with exit code %d\n' "$?"
1
Kusalananda