2012-08-04 20 views
5

Cuando comienzo un proceso en segundo plano en un terminal y de alguna forma si el terminal se cierra, entonces ya no podemos interactuar con ese proceso. No estoy seguro, pero creo que el proceso también será asesinado. ¿Puede alguien decirme cómo puedo desconectar ese proceso de mi terminal? Entonces, incluso si cierro la terminal, ¿puedo interactuar con el mismo proceso en la nueva terminal?¿Cómo separar un proceso del terminal en Unix?

Soy nuevo en Unix por lo que su información adicional me ayudará.

+2

¿Por qué no te pruebas primero? Comience un proceso en segundo plano, cierre la sesión y vuelva a ingresar y compruebe con 'ps' si el proceso aún está activo' – patrix

+0

Esto me parece una pregunta interesante y útil. Sospecho que los procesos iniciados a través de la terminal se eliminarán cuando se mate la terminal. Sinceramente, esto suena como un tenedor para mí, no lo sé, nunca he tenido la necesidad de invocar un tenedor. – Dale

+0

El proceso se cancela si cierra la sesión o si pierde su sesión, a menos que use el comando [nohup] (http://en.wikipedia.org/wiki/Nohup) :) pero no está seguro si puede volver a obtener el proceso una nueva sesión –

Respuesta

5

También puede considerar el comando screen. Tiene la funcionalidad de "restaurar mi sesión". Es cierto que nunca lo he usado, y lo olvidé.

Iniciar el proceso como daemon, o con nohup puede que no haga todo lo que desee, en términos de volver a capturar stdout/stdin.

Hay un montón de ejemplos en la web. En Google tratar, "comandos UNIX pantalla" y "tutorial pantalla UNIX":

3

primer resultado de Google para "demonizar un proceso UNIX":

Ver el demonio (3) página de manual para una descripción corta. Lo principal de la demonización es pasar al segundo plano sin detener ni retener nada. Una lista de cosas puede hacer un proceso para lograr esto:

  • tenedor()
  • setsid()
  • cerrar/redirección stdin/stdout/stderr a/dev/null, y/o hacer caso omiso SIGHUP/SIGPIPE.
  • chdir() a /.

Si se inició como un proceso de inicio, también desea hacer las cosas que necesita para ser root para primero, y luego soltar privilegios. Es decir, cambie el usuario efectivo al usuario "daemon" o "nobody" con setuid()/setgid(). Si no puede eliminar todos los privilegios y necesita acceso raíz , utilice seteuid() para soltarlo temporalmente cuando no lo necesite.

Si está bifurcando un daemon, también configure los controladores secundarios y, si llama al exec, establezca el cierre en los indicadores de ejecución en todos los descriptores de archivos que sus hijos no necesiten.

Y aquí es un COMO en la creación de los demonios Unix: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

+1

Más o menos lo que pensé. Si/cuando necesito escribir un daemon, estoy seguro de que tendré que google/stackoverflow todas estas tonterías. – Dale

13

El comando que estás buscando es renegar.

disown <processid> 

Esto es lo más cerca que puede llegar a un nohup. Se separa el proceso del inicio de sesión actual y le permite seguir funcionando. Gracias David Korn!

http://www2.research.att.com/~gsf/man/man1/disown.html

y yo acabo de encontrar reptyr que le permite Reparent un proceso repudiado. https://github.com/nelhage/reptyr

Ya está en los paquetes de ubuntu.

PERO si aún no ha iniciado el proceso y está planeando hacerlo en el futuro, entonces el camino a seguir es screen y tmux. Prefiero screen.

0

'Interactuar con' puede significar un par de cosas.

La razón por la cual un programa, iniciado en la línea de comandos, finaliza cuando termina, es porque el shell, cuando sale, envía ese proceso una señal HUP (consulte la documentación para kill(1) para una introducción; HUP, por el camino, es la abreviatura de 'cuelgue', e indicó originalmente que el usuario había colgado el módem/teléfono). La respuesta predeterminada a una señal HUP es que un proceso finaliza; es decir, el programa invocado sale.

Los detalles son un poco más complicados, pero esta es la intuición general.

El comando nohup le dice al shell que inicie el programa, y ​​para hacerlo de modo que esta señal HUP sea ignorada. Es decir, el programa continúa después de que sale la terminal de invocación.

Aún puede interactuar con este programa enviándole señales (consulte kill(1) nuevamente), pero este es un tipo de interacción muy limitado, y depende de que su programa esté escrito para hacer cosas sensibles cuando recibe esas señales (señales USR1 y USR2 son cosas útiles para atrapar, si te gustan ese tipo de cosas). Alternativamente, puede interactuar a través de conductos con nombre, semáforos u otros bits de comunicación entre procesos (IPC). Eso se pone un poco complicado rápidamente.

Sospecho que lo que está buscando, sin embargo, es poder volver a conectar una terminal al proceso. Es un proceso bastante más complicado, y las aplicaciones como screen hacen cosas complicadas detrás de escena para que eso suceda.

La cosa nohup es una especie de daemonización rápida y sucia. La función daemon(3) realiza la daemonización 'correctamente', haciendo varios trozos de ordenación como se describe en la respuesta de YePhIcK, para romper de forma integral el vínculo con el proceso/terminal que la invocó. Puede interactuar con ese proceso desmantelado con las mismas herramientas de IPC que antes, pero no directamente con un terminal.

Cuestiones relacionadas