Al kill -9 $PID &>/dev/null
finalizar un proceso con un script, todavía se imprime un mensaje en el terminal después de que termina el siguiente comando. ¿Cómo se detiene este comportamiento?
Por ejemplo
while true; do
/usr/bin/dostuff -a -b -c
PID=$(pidof -o %PPID /usr/bin/dostuff)
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
imprimirá algo como
hello
./my-cript.sh: line 12: 7134 Killed
/usr/bin/dostuff -a -b -c
Cuando solo quiero que imprima "hola"
EDITAR: La solución limpia es ejecutar el programa en una subshell o rechazarlo.
#SOLUTION
while true; do
/usr/bin/dostuff -a -b -c &
disown
PID=$!
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
&>
redirige stdin y stdoutRespuestas:
Las líneas de salida no se redirigen a / dev / null porque no son STDOUT / STDERR del proceso de eliminación . Son producto de los mecanismos de control de trabajo del shell.
Si está usando bash , puede ejecutar un rechazo inmediatamente después de la invocación del trabajo:
Probé esto en bash v3.2.39 en Debian Lenny,
/bin/sleep 10 &
en lugar del/usr/bin/dostuff
comando anterior :fuente
dostuff
con un seguimiento&
, puede obtener su pid como$!
(hasta que ejecute otro proceso en segundo plano). Eso te ahorrará lapidof
búsqueda ... oh sí, alguien ya dijo esto.La redirección del error no es efectiva porque este mensaje no se imprime mediante kill; el shell lo imprime cuando finaliza el trabajo en segundo plano (supongo que faltaba &).
Puede evitar esto ejecutándose en una subshell, usando paréntesis (pero tenga en cuenta otros posibles problemas):
fuente
&
. pero sí, esta es otra forma de manejar el problema.Podrías hacer
set -b
e instalar una trampa en SIGCHLD. Creo que el controlador SIGCHLD predeterminado es el que imprimirá (inmediatamente) el estado del trabajo en el terminal cuando lo haya hechoset -b
. Aquí lo estarías anulando.fuente
set
opción que controlara este comportamiento. es parte de la descripción de-m
(modo monitor) pero la configuración no parece ayudar. tampoco pude deshacerme de él atrapando a SIGCHLD. (juzgadostrap /bin/true SIGCHLD
, pero tal vez eso no es suficiente.)