Bash

等待多個程序,如果任何程序退出,則列印退出程式碼

  • March 11, 2022

我在這裡想要實現的是,通過腳本我同時執行 3 個不同的自定義應用程序等待,如果任何應用程序退出,通過通知或列印退出程式碼發出警報。

使用系統:Centos 6.8

我想到了 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;
}

您可以使用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

引用自:https://unix.stackexchange.com/questions/367372