Traer trabajo nohup a primer plano

14

Considere la siguiente nohupejecución:

nohup script.sh > script.out &

¿Hay alguna forma de cerrar sesión en el terminal, volver a conectar, volver a poner el proceso en primer plano e interactuar con él usando el teclado?

Adam Matan
fuente

Respuestas:

7

Si desea iniciar un script, ejecutarlo sin que la salida moleste a su terminal y luego abrirlo más tarde para interactuar con él, es posible que desee ver un multiplexor de terminal. Dependiendo de su sistema, recomendaría tmuxo screen. Puede encontrar información sobre cómo usarlos en los siguientes enlaces:

tmux:

pantalla:

editar: enlaces agregados para tmux primers

Gus E
fuente
+1 Excelente herramienta que no conocía. Muchas gracias.
Adam Matan
19

nohup no desconecta un comando del terminal, hace que su secuencia de comandos ignoreSIGHUPy redirigestdout/stderra un archivonohup.out, para que el comando pueda continuar ejecutándose en segundo plano después de cerrar sesión.

nohupno pone automáticamente el comando que ejecuta en segundo plano. Uno debe hacer eso explícitamente, terminando la línea de comando con un &.

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobspuede imprimir trabajos actualmente en ejecución y su estado. Si el comando jobsno puede encontrarlo, ya no es un proceso secundario de ese shell.

$ jobs 
[1]+  Running                 nohup ./script.sh &

Se puede recuperar un trabajo en segundo plano en primer plano en bash, fgincluso si se ejecuta con nohup. Pero eso no cambiará la redirección de salida, que seguirá yendo al archivonohup.out .

$ fg
nohup ./script.sh

Si cierra el shell / terminal o cierra sesión, su comando ya no es un hijo de ese shell. Pertenece al initproceso. Si busca pstree, verá que ahora es propiedad del proceso 1 ( init). Eso no se puede volver a poner en primer plano porque el primer plano ya no existe.

souravc
fuente
If the command jobs cannot find it, then it is no longer a child process of that shell.Este es un error: tratar esta secuencia para ver cómo: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. Después de este comando, todavía verá el sleeptrabajo con el mismo PID impreso cuando lo generó, mientras jobsque no imprimirá nada. La única forma en que un proceso hijo puede dejar de ser hijo es perdiendo a su padre (entonces el huérfano se convierte en hijo de init) o bifurcando + saliendo (pero luego el PID cambia, por lo que no es el hijo original).
Ruslan
4

Secundaré el uso de un multiplexor de terminal, pero tmux , no pantalla. La pantalla es, para todos los efectos, sin mantenimiento. Su configuración es un arte oscuro, probablemente registrado por primera vez en un apéndice del Necronomicon. Intentar escribir su propia configuración es como un vistazo a Cthulu. Seriamente. Mire a su alrededor los archivos .screenrc de las personas . Para estar seguros, hay formas de mediar la abominación de un archivo de configuración por parte de la pantalla. Byobu hace un trabajo admirable como el velo entre los usuarios mortales y el código impío. Viene con colores sensibles, una interfaz de menú y quizás lo más importante, una barra de estado.

Pero como dije, recomiendo tmux en su lugar. Todavía requiere una configuración menor, pero está bien documentado y su archivo de configuración no se verá como un galimatías. Además, comienzas con colores y una barra de estado. Compare mis archivos screenrc y tmux.conf:

djeikyb
fuente
0

Si solo está interesado en mirar en vivo la salida, esto podría ser adecuado para usted:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
confundir
fuente
0

Cualquier comando de Linux se puede enviar en segundo plano con ' &' agregado al final.

Para ver todos los trabajos en segundo plano, puede emitir jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

Aquí estoy ejecutando 3 trabajos en segundo plano: zookeeper, kafka y mongo daemon. [1], [2] y [3] son ​​números de trabajo respectivos para estas tareas.

Puede llevar esa tarea a primer plano usando fg %$taskNumber.

Sudip Bhandari
fuente