2011-11-10 9 views
7

corro un guión como:Cómo proteger la salida de matar

sleep 20 & 
PID=$! 
kill -9 $PID >/dev/null 2>&1 

no quiero el guión mostrar el resultado como:

line 51: 22943 Killed sleep 

no tengo ni idea de por qué esto suceda, tengo redirigir la salida a/dev/null

Respuesta

15

El mensaje no proviene de kill ni del comando de fondo, viene de bash cuando descubre que una de sus tareas de fondo ha sido eliminada. Para evitar el mensaje, utilice disown para quitarlo de control de trabajo de bash:

sleep 20 & 
PID=$! 
disown $PID 
kill -9 $PID 
+0

genial, esto es lo que quiero, muchas gracias amigo ... – chemila

+0

repudio tiene implicación de que shell no envíe 'SIGHUP' al hijo cuando termina, vea [esta pregunta] (http://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and). Aquí está la [respuesta] (http://stackoverflow.com/a/5722850/52499). –

6

Esto se puede hacer usando 'espera' + redirección de espera a/dev/null:

sleep 2 & 
PID=$! 
kill -9 $PID 
wait $PID 2>/dev/null 
sleep 2 
sleep 2 
sleep 2 

Este script no dar el mensaje "muerto":

-bash-4.1$ ./test 
-bash-4.1$ 

Mientras que, si intenta usar algo como:

sleep 2 & 
PID=$! 
kill -9 $PID 2>/dev/null 
sleep 2 
sleep 2 
sleep 2 

Se te mostrará el mensaje:

-bash-4.1$ ./test 
./test: line 4: 5520 Killed     sleep 2 
-bash-4.1$ 

me gusta esta solución mucho más que el uso de 'desconocer' que puede tener otras implicaciones.

fuente Idea: https://stackoverflow.com/a/5722850/1208218

+0

Esto se puede mejorar ligeramente cambiando la instrucción kill -9 a: kill -9 $ PID 2>/dev/null Esto se debe a que kill también puede generar otros mensajes como: línea 3: kill: (3968) - No existe dicho proceso Dependiendo de lo que esté haciendo el script – Roel

-1

Otra forma de desactivar las notificaciones de trabajo es poner su orden que debe ser en segundo plano en una construcción de sh -c 'cmd &'.

#!/bin/bash 

# ... 

sh -c ' 
sleep 20 & 
PID=$! 
kill -9 $PID # >/dev/null 2>&1 
' 

# ... 
-1

Pude lograr esto al redirigir la salida del comando que estoy ejecutando en segundo plano. En su caso se vería así:

sleep 20 >>${LOG_FILE} 2>&1 & 

... o si no desea un archivo de registro:

sleep 20 &> /dev/null & 

Entonces, cuando se quiere matar a ese proceso en segundo plano PID, lo hará no se muestra en la salida estándar.