Подождите несколько процессов, распечатайте код выхода, если какой-либо процесс завершит работу

То, что я пытаюсь достичь здесь, через скрипт, я запускаю 3 разных пользовательских приложения в ожидании одновременно, если какое-либо приложение получает выход, выдает предупреждение через уведомление или код выхода на печать.

Используемая система: Centos 6.8

Я думал о дочери Баша 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; 

Команда wait в bash имеет параметр -n :

Если -n опция -n , ожидание ожидает завершения любого задания и возврата его статуса выхода.

Это означает, что вы можете сделать

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