2012-02-08 23 views
67

Escribí dos scripts de shell a.sh y b.sh. En a.sh y b.sh tengo un infinito for loop e imprimen algunos resultados en el terminal. Quiero escribir otra secuencia de comandos que invoque tanto a.sh como b.sh, pero quiero que el usuario recupere el control de la terminal de inmediato, en lugar de tener la secuencia de comandos ejecutándose infinitamente y quiero ocultar la salida en la terminal.Cómo ejecutar un script de shell en segundo plano y no obtener resultados

Respuesta

139

Use nohup si su trabajo de fondo tarda mucho tiempo en terminar o si simplemente usa SecureCRT o algo así, inicie sesión en el servidor.

redirigir la stdout y stderr-/dev/null ignorar la salida.

nohup /path/to/your/script.sh > /dev/null 2>&1 & 
+0

Solo para agregar, a veces hay argumentos para los scripts, entonces el comando anterior devolverá ** Redirección de salida ambigua **. – sabertooth1990

+0

Una mejor forma que encontré es usar 'nohup /path/to/your/script.sh parameter1> & 1 &' Si alguien conoce una mejor manera. – sabertooth1990

+2

No necesita '/ dev/null 2> & 1' si está usando' nohup', ya que agrega todas las secuencias STDOUT y STDERR al archivo nohup.out automágicamente. Use simplemente: 'nohup/ruta/a/su/comando &' – leonarth

11

Si están en el mismo directorio que el script que contiene:

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

El & al final es lo que hace el script ejecutándose en segundo plano.

La parte > /dev/null 2>&1 no es necesaria - redirige las corrientes stdout y stderr para que no tenga que verlas en el terminal, lo que puede querer hacer para scripts ruidosos con muchos resultados.

+0

gracias a todos los cuerpos. todas las respuestas fueron útiles realmente gracias. –

23

redirigir la salida a un archivo de la siguiente manera:

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

Esto redirigirá stdout y stderr al mismo archivo. Si desea redirigir stdout y stderr en dos archivos diferentes utilizar este:

./a.sh > stdoutfile 2> stderrfile & 

Puede utilizar /dev/null como uno o ambos de los archivos si no se preocupan por la salida estándar y/o stderr.

Consulte bash manpage para obtener detalles sobre las redirecciones.

13

siento que es un poco tarde, pero no encontró la solución ideal para los comandos somple en el que no desea ninguna salida estándar o error (crédito donde es debido: http://felixmilea.com/2014/12/running-bash-commands-background-properly/)

Esto redirige la salida en null y mantiene la pantalla despejada:

command &>/dev/null & 
+0

Nota: el comando finalizará cuando la terminal está cerrado. – Banana

+0

Para cualquiera que mire esto en el futuro y quiera una solución para mantener los comandos en ejecución después de que termine una sesión, sugeriría screen o tmux. Esencial ejecutar una 'sesión dentro de una sesión' que continúa después de cerrar la sesión inicial. A continuación, 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, donde la sincronización necesita ejecutarse durante un tiempo prolongado y no desea que su sesión se ejecute. – DanteAlighieri

Cuestiones relacionadas