複数のプロセスを待ち、プロセスが終了したら終了コードを印刷します。

複数のプロセスを待ち、プロセスが終了したら終了コードを印刷します。

ここで達成することは、スクリプトを介して3つの異なるカスタムアプリケーションを同時に実行し、待ってからアプリケーションが終了したときに通知を介して警告を受けたり、終了コードを印刷することです。

使用システム:Centos 6.8

答え1

(4.3以降)waitのコマンドには次のオプションがあります。bash-n

-nこのオプションが指定されると、waitはジョブが終了するのを待ってから終了ステータスを返します。

これはあなたができることを意味します

command1 &
command2 &
command3 &

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

答え2

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
done

wait -n元の状態ではなく、子プロセスの終了状態のみが返されますPID

答え3

Bashを考えましたが、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;
}

答え4

Bash 5.1以降では、次のことができます。

while
  wait -np id
  status=$?
  [ -n "$id" ]
do
  echo "process of ID $id exited with status $status"
done
bash-5.2$ ヘルプ待機中
待つ:待つ[-FN][-p変数][ID...]
    ジョブが完了して終了ステータスが返されるのを待ちます。

    プロセスIDまたはIDである可能性があるIDで識別された各プロセスを待ちます。
    ジョブの仕様を確認して終了状況を報告します。身分証明書でない場合
    与えられた場合、現在アクティブなすべての子プロセスを待ってから返します。
    状態は 0 です。 IDがジョブ仕様の場合は、すべてのプロセスを待ちます。
    今回の作業の流れ上。

    -n オプションが指定された場合は、ID リストで単一のジョブを待ちます。
    または、IDが指定されていない場合は、次の操作を完了してそのIDを返します。
    終了ステータス。

    -pオプションが指定された場合、ジョブのプロセスまたはジョブ識別子
    返された終了ステータスは変数VARに割り当てられます。
    オプションパラメーターに名前が付けられます。この変数は最初は設定解除されます。
    すべてのミッション。これは -n オプションが提供されている場合にのみ便利です。

    -fオプションが指定され、ジョブ制御が有効になっている場合に待ちます。
    状態が変わるのを待たずに終了するIDを指定します。

    終了ステータス:
    IDが無効であるか無効な場合は、最後のIDのステータスを返します。
    オプションが与えられた場合、または-nが指定され、シェルに待機していないオプションがない場合
    子供たち。

関連情報