
Según tengo entendido,Los trabajos son tuberíascomenzó desde un determinado shell y puede administrar estos trabajos ( fg
, bg
, Ctrl-Z) desde este shell. Un trabajo puede constar de múltiples procesos/comandos.
Mi pregunta es ¿qué sucede con estos trabajos cuando sale el shell original que contiene? Supongamos que huponexit no está configurado para que los procesos en segundo plano sigan ejecutándose después de que se cierre el shell.
Supongamos que he hecho:
$ run.sh | grep 'abc' &
[1] job_id
Luego salgo de este shell. Entraré en un nuevo shell y lo ejecutaré jobs
y obviamente no veo nada. Pero puedo hacer ps aux | grep run.sh
y ver este proceso en ejecución y también haré ps aux | grep grep
y veré el proceso en grep 'abc'
ejecución.
¿Hay alguna manera de obtener el ID del trabajo para toda la canalización para poder eliminarlo de una sola vez, o tengo que eliminar todos los procesos por separado desde otro shell una vez que haya salido del shell original? (He probado este último y funciona, pero parece complicado realizar un seguimiento de todos los procesos).
Respuesta1
Cuando el shell se cierra, puede enviar la señal HUP a trabajos en segundo plano y esto puede hacer que se cierren. La señal SIGHUP solo se envía si el propio shell recibe un SIGHUP, es decir, solo si el terminal desaparece (por ejemplo, porque el proceso del emulador de terminal muere) y no si sale del shell normalmente (con el comando exit
incorporado o escribiendo Ctrl+D ). Ver¿En qué casos SIGHUP no se envía a un trabajo al cerrar sesión?y¿Existe alguna variante de UNIX en la que un proceso hijo muera con su padre?para más detalles. En bash, puede configurar la huponexit
opción para enviar también SIGHUP a trabajos en segundo plano en una salida normal. En ksh, bash y zsh, llamar disown
a un trabajo lo elimina de la lista de trabajos a los que enviar SIGHUP. Un proceso que recibe SIGHUP puede ignorar o captar la señal y luego no morirá. Usarlo nohup
cuando ejecuta un programa lo hace inmune a SIGHUP.
Si el proceso no finaliza debido a un posible SIGHUP, entonces permanece atrás. No queda nada para relacionarlo con los números de trabajo en el shell.
El proceso aún puede morir si intenta acceder al terminal pero el terminal ya no existe. Eso depende de cómo reacciona el programa ante una terminal inexistente.
Si el trabajo contiene múltiples procesos (por ejemplo, una canalización), entonces todos estos procesos están en uno.grupo de proceso. Los grupos de procesos se inventaron precisamente para capturar la noción de un trabajo de shell que se compone de múltiples procesos relacionados. Puede ver los procesos agrupados por grupo de procesos mostrando su ID de grupo de procesos (PGID, normalmente el ID de proceso del primer proceso del grupo), por ejemplo, en ps l
Linux o algo así como ps -o pid,pgid,tty,etime,comm
portátil.
Puede eliminar todos los procesos de un grupo pasando un argumento negativo a kill
. Por ejemplo, si ha determinado que el PGID de la canalización que desea eliminar es 1234, puede eliminarlo con
kill -TERM -1234
Respuesta2
En general, todavía se ejecutan, pero debes usar nohup, si lo olvidaste o cambiaste de opinión, usa disown.
mike@mike-laptop4:~$ sleep 500
^Z
[1]+ Stopped sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+ Running sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$