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 wait
comando en bash
(4.3 y posteriores) tiene una -n
opción:
Si
-n
se 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 -n
para 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 -n
solo devuelve el estado de salida del niño, no cuál PID
era.
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.