Cómo ejecutar un script de shell en segundo plano y no obtener resultados

111

Escribí dos scripts de shell a.shy b.sh. En a.shy b.shtengo un bucle for infinito e imprimen algo de salida en la terminal. Quiero escribir otro guión que exige tanto a.shy b.shpero quiero que el usuario pueda recuperar el control de la terminal de inmediato, en lugar de tener el script se ejecute infinitamente y yo quiero ocultar la salida de la terminal.

Safari de Behnam
fuente

Respuestas:

220

Úselo nohupsi su trabajo en segundo plano tarda mucho en finalizar o si simplemente usa SecureCRT o algo así para iniciar sesión en el servidor.

Redirija stdout y stderr a /dev/nullpara ignorar la salida.

nohup /path/to/your/script.sh > /dev/null 2>&1 &
Jorge
fuente
Solo para agregar, a veces hay argumentos para los scripts, luego el comando anterior devolverá la redirección de salida ambigua .
dientes de sable
Una mejor manera que encontré es usar nohup /path/to/your/script.sh parameter1 > & 1 &Si alguien conoce una mejor manera.
dientes de sable
17
No es necesario /dev/null 2>&1si está utilizando nohup, ya que ya agrega automáticamente todas las transmisiones STDOUT y STDERR al archivo nohup.out. Use solo:nohup /path/to/your/command &
Leonardo
1
@ sabertooth1990 Su línea de comando es defectuosa:-bash: syntax error near unexpected token '&'
notes-jj
1
¿Cómo matarías entonces el proceso creado?
Alexis_A
32

Redirija la salida a un archivo como este:

./a.sh > somefile 2>&1 &

Esto redirigirá tanto stdout como stderr al mismo archivo. Si desea redirigir stdout y stderr a dos archivos diferentes, use esto:

./a.sh > stdoutfile 2> stderrfile &

Puede utilizar /dev/nullcomo uno o ambos archivos si no le importa stdout y / o stderr.

Consulte la página de manual de bash para obtener detalles sobre las redirecciones.

Adam Zalcman
fuente
23

Lo siento, esto es un poco tarde, pero encontré la solución ideal para algunos comandos en los que no desea ningún resultado estándar o de error (crédito donde se debe: http://felixmilea.com/2014/12/running-bash-commands-background -propiadamente / )

Esto redirige la salida a nula y mantiene la pantalla limpia:

command &>/dev/null &
Dante Alighieri
fuente
2
Nota: el comando terminará cuando se cierre el terminal.
Banana
1
Para cualquiera que vea esto en el futuro y quiera una solución para mantener los comandos en ejecución después de que finaliza una sesión, sugeriría screen o tmux. Esencialmente, ejecutan una "sesión dentro de una sesión" que continúa después de cerrar la sesión inicial. Luego, puede volver a conectarse a la sesión en curso si vuelve a iniciar sesión. Excelente para ejecutar copias de seguridad de rsync, por ejemplo, cuando la sincronización debe ejecutarse durante mucho tiempo y no desea dejar la sesión en ejecución.
DanteAlighieri
13

Si están en el mismo directorio que su secuencia de comandos que contiene:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

El &al final es lo que hace que su script se ejecute en segundo plano.

La > /dev/null 2>&1parte no es necesaria: redirige los flujos stdout y stderr para que no tenga que verlos en la terminal, lo que puede hacer para scripts ruidosos con muchos resultados.

Michael Chinen
fuente
7

Ejecutar en una subcapa para eliminar notificaciones y cerrar STDOUT y STDERR:

(&>/dev/null script.sh &)
Tom Hale
fuente
Esta es la única respuesta que tampoco imprime registros de trabajos en segundo plano como [1] + 54765 done <emacs>agradecimiento
alper
2

Si desea ejecutar el script en Linux kickstart, debe ejecutarlo como se muestra a continuación.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &
SARATH CHANDRAN
fuente
1
nohup sh -x runShellScripts.sh &
vaquar khan
fuente
¿qué -xhacer?
alper
0

Estos ejemplos funcionan bien:

nohup sh prog.sh proglog.log 2> & 1 &

Para el bucle se puede utilizar así:

para i en {1..10}; hacer sh prog.sh; dormir 1; hecho prog.log 2> & 1 &

Funciona en segundo plano y no muestra ningún resultado.

Ramin Ismayilli
fuente