¿Qué sucede con los trabajos en segundo plano después de salir del shell?

¿Qué sucede con los trabajos en segundo plano después de salir del shell?

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é jobsy obviamente no veo nada. Pero puedo hacer ps aux | grep run.shy ver este proceso en ejecución y también haré ps aux | grep grepy 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 exitincorporado 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 huponexitopción para enviar también SIGHUP a trabajos en segundo plano en una salida normal. En ksh, bash y zsh, llamar disowna 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 nohupcuando 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 lLinux o algo así como ps -o pid,pgid,tty,etime,commportá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:~$ 

información relacionada