Espere varios procesos, imprima el código de salida si algún proceso sale

Espere varios procesos, imprima el código de salida si algún proceso sale

Lo que estoy tratando de lograr aquí es que, a través de un script, estoy ejecutando 3 aplicaciones personalizadas diferentes en espera simultáneamente, si alguna aplicación sale, dar una alerta mediante notificación o imprimir el código de salida.

Sistema en uso: Centos 6.8

Respuesta1

El waitcomando en bash(4.3 y posteriores) tiene una -nopción:

Si -nse proporciona la opción, espera a que finalice cualquier trabajo y devuelve su estado de salida.

Esto significa que puedes hacer

command1 &
command2 &
command3 &

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

Respuesta2

Puede usar wait -npara esperar a que un niño salga, luego probar a cada niño para ver si todavía está ejecutando con kill -0, para ver cuál acaba de salir, de esta manera:

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 -nsolo devuelve el estado de salida del niño, no cuál PIDera.

Respuesta3

Pensé en Bash wait -n, pero no te permite saber qué proceso secundario salió. ¿Qué tal un script Perl simple?

#!/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;
}

Respuesta4

Con bash 5.1 o posterior, puedes hacer:

while
  wait -np id
  status=$?
  [ -n "$id" ]
do
  echo "process of ID $id exited with status $status"
done
bash-5.2$ ayuda a esperar
esperar:esperar[-Fnorte] [-pvar] [identificación...]
    Espere a que se complete el trabajo y regrese al estado de salida.

    Espera por cada proceso identificado por un ID, que puede ser un ID de proceso o un
    especificación del trabajo e informa su estado de terminación. Si la identificación no es
    dado, espera todos los procesos secundarios actualmente activos y el retorno
    El estado es cero. Si ID es una especificación de trabajo, espera todos los procesos.
    en la cartera de ese trabajo.

    Si se proporciona la opción -n, espera un único trabajo de la lista de ID,
    o, si no se proporcionan ID, para que se complete el siguiente trabajo y devuelva su
    estado de salida.

    Si se proporciona la opción -p, el proceso o identificador de trabajo del trabajo
    para el cual se devuelve el estado de salida se asigna a la variable VAR
    nombrado por el argumento de opción. La variable se desarmará inicialmente, antes
    cualquier encargo. Esto sólo es útil cuando se proporciona la opción -n.

    Si se proporciona la opción -f y el control de trabajo está habilitado, espera a que
    ID especificado para terminar, en lugar de esperar a que cambie de estado.

    Estado de salida:
    Devuelve el estado del último ID; falla si la identificación no es válida o no es válida
    se proporciona la opción, o si se proporciona -n y el shell no tiene ninguna opción no esperada.
    niños.

información relacionada