3 votos

Cierre la ventana de Terminal, no mata a la ejecución de secuencias de comandos con sudo

X-publicación de unix.SE en la recomendación.

Tengo un script de bash llamado testing guardado en /usr/local/bin.

En una ventana de Terminal en mac os puedo ejecutar sudo testing. En una segunda ventana de terminal, generar una lista de los procesos de:

ps -axo tty,pid,ppid,args | { head -1; grep "bash\|testing" | grep -v grep; }

Que devuelve como se esperaba:

TTY        PID  PPID ARGS
ttys000  73674 73673 -bash                              # login shell used to run sudo
ttys000  73701 73674 sudo testing                       # sudo process
ttys000  73702 73701 /bin/bash /usr/local/bin/testing   # "testing" bash script being run by sudo
ttys001   3714  3713 -bash                              # second login shell used to generate this process list

Sin embargo, después de dejar de fumar la primera ventana de Terminal (mientras testing todavía se está ejecutando dentro de ella), el proceso de la lista se parece a esto:

TTY        PID  PPID ARGS
??       73701     1 sudo testing
??       73702 73701 /bin/bash /usr/local/bin/testing
ttys001   3714  3713 -bash

Como era de esperar, el primer shell de inicio de sesión ha sido terminada y la segunda shell de inicio de sesión aún se está ejecutando. Pero el sudo proceso y su bifurcada (ahora huérfanos) niño, testing script, que todavía se están ejecutando!

Sospecho que esto es debido a que el usuario, no como root, es el cierre de la ventana de Terminal, y como tal no tiene los permisos necesarios para afectar a los procesos de root. Es esto correcto? Me siento como que me falta algo básico aquí. Hay alguna manera de permitir que la root de los procesos a ser terminado por cerrar la ventana de Terminal?

3voto

David Anderson Puntos 2189

Estás hablando de los huérfanos de los procesos. Como verás, tu pregunta tiene poco que ver con sudo. Los huérfanos son asignados para el proceso 1. Este proceso 1 se llama init y es un proceso demonio que continúa ejecutándose hasta que se apaga el sistema. Aquí hay dos ejemplos sencillos donde los huérfanos son creados. El macOS es Alta Sierra que utiliza bash como shell por defecto.

Si decide repetir los ejemplos, usted tendrá que reemplazar los identificadores de proceso con el que se obtiene.

Cuando el padre windows termina, un cuelgue de la señal (SIGHUP) se envía a los procesos hijo. Normalmente, esto hace que cada niño en los procesos de terminar. Sin embargo, si un niño decide no terminar o nunca se envía una señal hangup (SIGHUP), entonces el niño puede llegar a ser un huérfano.

Ejemplo 1

Abrir una nueva ventana de Terminal y escriba el comando shopt -s huponexit. Este comando es necesario porque bash es un shell de inicio de sesión. La salida se muestra a continuación.

Last login: Thu Mar 12 17:02:31 on ttys008
Marlin:~ davidanderson$ shopt -s huponexit
Marlin:~ davidanderson$

Ingrese el comando { trap '' hup; sleep 60000; } &, como se muestra a continuación.

Marlin:~ davidanderson$ { trap '' hup; sleep 60000; } &
[1] 8993
Marlin:~ davidanderson$

Aquí un nuevo proceso de 8993 es creado como trabajo 1. El trap '' hup comando hace que el cuelgue de la señal (SIGHUP) para ser ignorado. A continuación, abra otra ventana de Terminal y escriba el comando ps -axo tty,pid,ppid,args 8993, como se muestra a continuación.

Last login: Thu Mar 12 17:09:12 on ttys008
Marlin:~ davidanderson$ ps -axo tty,pid,ppid,args 8993
TTY        PID  PPID ARGS
ttys008   8993  8972 -bash
Marlin:~ davidanderson$ 

Esto muestra la primera ventana se asignó ttys008 y tiene un id de proceso de 8972. Siguiente, la primera ventana es cerrada. En la ventana emergente, Terminate está seleccionado. Un cuelgue de la señal (SIGHUP) es enviado a proceso 8972, que se omite. Proceso de 8972 ahora es huérfano y se le asignará un proceso de 1. La repetición de la ps -axo tty,pid,ppid,args 8993 comando en la segunda ventana se muestran. Ver a continuación.

Marlin:~ davidanderson$ ps -axo tty,pid,ppid,args 8993
TTY        PID  PPID ARGS
??        8993     1 -bash
Marlin:~ davidanderson$

Finalmente, los comandos que se muestran a continuación se introducen para enviar un terminal de señal (SIGTERM) para el proceso de 8993 y muestran que el proceso ha terminado.

Marlin:~ davidanderson$ kill 8993
Marlin:~ davidanderson$ ps -axo tty,pid,ppid,args 8993
TTY        PID  PPID ARGS
Marlin:~ davidanderson$

Ejemplo 2

Este es básicamente el mismo que en el ejemplo 1, excepto que en lugar de tener el proceso ignorar la señal hangup (SIGHUP), el disown %1 comando es usado para prevenir una señal hangup (SIGHUP) de ser enviado para el proceso. Abrir una nueva ventana de Terminal y escriba el command shopt -s huponexit. Este comando es necesario porque bash es un shell de inicio de sesión. La salida se muestra a continuación.

Last login: Thu Mar 12 17:02:31 on ttys008
Marlin:~ davidanderson$ shopt -s huponexit
Marlin:~ davidanderson$

A continuación, escriba sleep 60000 & , seguido por disown %1. El %1 parámetro representa el trabajo 1. Los resultados se muestran a continuación.

Last login: Thu Mar 12 17:14:54 on ttys010
Marlin:~ davidanderson$ sleep 60000 &
[1] 9139
Marlin:~ davidanderson$ disown %1
Marlin:~ davidanderson$

En la segunda ventana, escriba ps -axo tty,pid,ppid,args 9139. Los resultados se muestran a continuación.

Marlin:~ davidanderson$ ps -axo tty,pid,ppid,args 9139
TTY        PID  PPID ARGS
ttys008   9139  9130 sleep 60000
Marlin:~ davidanderson$

Tras el cierre de la tercera ventana, escriba ps -axo tty,pid,ppid,args 9139 en la segunda ventana. Los resultados se muestran a continuación. Otro huérfano que ha sido creado.

Marlin:~ davidanderson$ ps -axo tty,pid,ppid,args 9139
TTY        PID  PPID ARGS
??        9139     1 sleep 60000
Marlin:~ davidanderson$ 

Por último, introduzca kill 9139 y ps -axo tty,pid,ppid,args 9139, como se muestra a continuación.

Marlin:~ davidanderson$ kill 9139
Marlin:~ davidanderson$ ps -axo tty,pid,ppid,args 9139
TTY        PID  PPID ARGS
Marlin:~ davidanderson$ 

Referencias

Huérfano proceso
Zombie proceso
init
Demonio

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X