Ejecute el script Bash en segundo plano y salga de la terminal

Respuestas:

45

Para evitar que las señales de salida se propaguen a los procesos secundarios del terminal y el shell, ejecute el comando con nohup, es decir:

nohup cmd &
Thor
fuente
1
Esta es la respuesta correcta. Sin nohup, el proceso iniciado aún se considera un "hijo" del proceso terminal y, por lo tanto, finaliza si el terminal está cerrado.
Izzy
3
cmd & disowntambién funciona, ya que &se trata como un ;separador de comandos. El comando disown elimina la conexión entre la sesión de shell bash y el comando de fondo.
lornix
2
zsh tiene una taquigrafía para esto: cmd &|.
Thor
Para que esto funcione, tuve que cambiar una preferencia en Terminal.app. En Perfiles, seleccione su perfil activo, luego Shell> Cuando sale el shell> Cerrar si el shell salió limpiamente
antoine
6

Utilizando screen:

screen -S <session name> -d -m <your command>

después de eso, puede salir de la terminal, también puede volver a conectarla:

screen -r <session name>

Más información: referencia

Bruce
fuente
4

Si desea ejecutar un comando o archivo específico cada segundo más o menos en segundo plano después de salir del terminal, puede probar esta pequeña cosa fácil;

nohup watch -n5 'bash script.sh' &

Eso correría scipt.sh cada 5 segundos.

jamietelin
fuente
1
"nohup" ya está cubierto por la respuesta aceptada. Y estoy bastante seguro de que el autor de la pregunta mencionó cron porque lo estaban usando para decir "Ejecute este comando unos segundos en el futuro", no para ejecutarlo periódicamente.
David Richerby
1
Mi respuesta no empeora las cosas. Ver el punto de voto negativo. Neural sería suficiente.
jamietelin
3

Ponga un carácter "&" después de su comando.

p.ej:

/home/your/script.sh &
Flinth
fuente
77
en este caso, cuando el terminal está cerrado, también comienza el proceso /home/your/script.sh, ya que no se desconectó de su "padre", sino que simplemente "quedó en segundo plano". Úselo nohuppara separarlo de verdad.
Izzy
Lo malo, no lo sabía, pero cuando probé en mi Debian, el comando siguió ejecutándose después de cerrar el shell que lo lanzó: /
Flinth
1
No estoy seguro de dónde está conectado exactamente el proceso en segundo plano y cuándo. Pero si, por ejemplo, inicia sesión en una máquina remota, definitivamente se detendrá tan pronto como cierre la sesión (excepto si se demonizó a sí mismo). Por lo tanto, para estar 100% seguro, prefiere usar nohup, que también registra todos los resultados (ahora invisibles) en un archivo llamado nohup.outubicado en el directorio desde el que inició el comando.
Izzy
Bien, gracias por tus explicaciones ^^
Flinth
Esta respuesta podría funcionar bien cuando se combina con el jobscomando. Muy a menudo quiero poder volver al proceso de shell después de ponerlo en segundo plano.
djangofan