Aguarde vários processos, imprima o código de saída se algum processo sair

2

O que eu estou tentando alcançar aqui é que, através do script, eu estou executando 3 aplicativos personalizados diferentes em espera simultaneamente, se algum aplicativo sair, forneça um alerta por meio de notificação ou imprima o código de saída.

Sistema em uso: Centos 6.8

    
por Rakesh.N 26.05.2017 / 10:02

3 respostas

2

Pensei no wait -n do Bash, mas ele não informou qual processo filho foi encerrado. Que tal um script Perl simples?

#!/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;
}
    
por 26.05.2017 / 10:31
2

Você pode usar wait -n para esperar o primeiro filho sair e testar cada filho se eles ainda estiverem em execução com kill -0 , assim:

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;
    
por 27.05.2017 / 18:19
0

O comando wait em bash tem uma opção -n :

If the -n option is supplied, wait waits for any job to terminate and returns its exit status.

Isso significa que você pode fazer

command1 &
command2 &
command3 &

wait -n
printf 'One command exited with exit code %d\n' "$?"
    
por 26.05.2017 / 10:09