
ここで達成することは、スクリプトを介して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が指定され、シェルに待機していないオプションがない場合 子供たち。