¿Cómo puedo cerrar una terminal sin matar a sus hijos (sin ejecutar primero `screen`)?

35

a veces ejecuto una aplicación en el terminal gnome, pero de repente tengo que reiniciar gnome o algo así. Supongo que la respuesta a la pregunta también es útil, entonces quiero desconectarme de SSH donde algo está sucediendo.

El árbol terminal de Gnome se ve así:

gnome-terminal
    bash
        some-boring-process

¿Puedo 'de desconexión' bashdel gnome-terminal(o de separación some-boring-processde bash y redirigir su salida de alguna parte)? Si solo mato gnome-terminal, bashseré asesinado a voluntad todos sus subprocesos

valya
fuente

Respuestas:

48

Si se some-boring-processestá ejecutando en su sesión de bash actual:

  1. detenerlo ctrl-zpara darle el aviso de bash
  2. ponerlo en el fondo con bg
  3. anote el número de trabajo o use el jobscomando
  4. separe el proceso de esta sesión bash con disown -h %1(sustituya el número de trabajo real allí).

Eso no hace nada para redirigir la salida; debe pensar en eso cuando inicie su proceso aburrido. [Editar] Parece que hay una manera de redirigirlo https://gist.github.com/782263

Pero en serio, mira en la pantalla. Tengo shells en un servidor remoto que se han estado ejecutando durante meses.

Glenn Jackman
fuente
Gracias. Seleccioné su respuesta porque era la única que respondía la pregunta (se trataba del proceso que ya se estaba ejecutando). A screenveces ya estoy usando , aunque tiene sus problemas y no quiero usarlo para cada sesión de bash en mi vida
valya
No lo usa para todas las sesiones de bash, sino para todas las máquinas remotas donde pasa mucho tiempo.
Glenn Jackman
Me tomé la libertad de agregar información sobre cómo redirigir la salida, ¡revísela!
valya
[root @ server ~] # bg -bash: bg: current: no such job
Muhammad Dyas Yaskur
¿Por qué lo tengo bash: bg: current: no such job?
Muhammad Dyas Yaskur
10

Esto es exactamente para lo que fueron creados screen y tmux . Ejecuta el shell dentro de la sesión screen / tmux, y puede desconectarse / reconectarse a voluntad. También puede tener múltiples sesiones de shell ejecutándose dentro de un gnome-terminal.

jsbillings
fuente
Gracias, pero, como comenté a la respuesta aceptada: 1. la pregunta era sobre el proceso en ejecución. 2. screentiene sus problemas y no tengo ganas de usarlo para cada sesión de bash en mi vida
valya
6

screen, tmuxo dtach(posiblemente con dvtm) son geniales para esto, pero si es algo en lo que no pensaste usar uno de ellos, puedes aprovechar nohup.

Hank Gay
fuente
Gracias, pero, como comenté a la respuesta aceptada: 1. la pregunta era sobre el proceso en ejecución. 2. screentiene sus problemas y no tengo ganas de usarlo para cada sesión de bash en mi vida
valya
@valya Me alegra que hayas encontrado una solución. Sin embargo, para ser claros, nohupfunciona en un proceso en ejecución mediante el uso de la -popción (si está disponible).
Hank Gay
@Hank Gay: No puedo ver una -popción nohupen las páginas del manual; en que sistema estas
Mikel
@Mikel Antes de aprender a dejar de preocuparme y amar la tmux, usé la -popción en una caja de Solaris. También tengo vagos recuerdos de haberlo hecho en una caja CentOS mestiza (¿posiblemente zshtenga un dispositivo incorporado que lo soporte?), Pero no puedo encontrar ningún documento sobre eso.
Hank Gay
@Hank Gay: Ni bashtampoco zshen mi sistema Ubuntu Linux proporcionar nohup.
Mikel
4

Si desea seguir interactuando con el proceso secundario en lugar de simplemente hacerlo en segundo plano y continuar, en realidad hay un programa llamado retty que es una prueba de concepto para "robar" un proceso de su tty actual y volver a conectarlo al el actual.

Sin embargo, hace algunas cosas horribles, como pegar un código de ensamblaje en la pila de la aplicación adjunta. Y ese código no se ha actualizado para x86_64.

Hay otro programa que adopta un enfoque tal vez mejor, congelando el proceso en el espacio de usuario a un archivo, desde el cual luego se puede restaurar (posiblemente en otro tty). Esto es crioideo , y ese proyecto también parece haberse detenido en el fase de prueba de concepto, y no funciona con Linux moderno tal como está el código. Ah bueno.

Solo pensé que esto debería estar aquí para completar. Si no te importa recurrir al vudú horrible, esto está dentro del ámbito de la posibilidad, al menos, la posibilidad teórica.

mattdm
fuente
1
eso me recuerda a gist.github.com/782263 ... oh, esa esencia parece responder a mi pregunta también
valya
2

Si enciendo algo que quiero terminar sin importar qué (salvo el reinicio del sistema), lo uso nohupy lo ejecuto en segundo plano. A diferencia de la pantalla y similares, no puede volver a conectar los procesos. Sin embargo, al desviar la redirección a otra parte, se puede encontrar cualquier salida nohup.out.

Lo uso screencuando quiero poder cambiar terminales para un proceso. Como comenzar un proceso desde el hogar / trabajo y cambiar al otro. Como cualquier otra salida de sesión de terminal, eventualmente se desplazará desde la parte superior del búfer.

EDITAR: si ya ha iniciado el proceso, puede disownhacerlo para evitar HUPque se envíe la señal cuando el proceso se cierre.

BillThor
fuente
Gracias, pero, como comenté a la respuesta aceptada: 1. la pregunta era sobre el proceso en ejecución. 2. screentiene sus problemas y no tengo ganas de usarlo para cada sesión de bash en mi vida
valya
@valya He visto referencias para desconectar un proceso en ejecución del grupo de programas. Sin embargo, no conozco ninguna herramienta para hacerlo. Es probable que la herramienta también deba redirigir los canales estándar de E / S. Creo que lo hice funcionar una vez, pero decidí que nohup era más simple.
BillThor
1

Puede hacer que un proceso (PID) no reciba una señal HUP cuando finaliza la sesión del terminal. Use el siguiente comando:

nohup -p PID
Tony
fuente
nohup: invalid option -- 'p'. ¿Qué versión de nohupestá ejecutando en qué tipo de sistema?
Anthon
Principalmente uso Solaris y AIX. Para Linux, debe verificar el comando disown.
Tony
Sí, no hay -popción en Linux, por lo que esta respuesta es específica de Solaris y AIX. Sin embargo, es bueno saberlo
Sergiy Kolodyazhnyy
1

Este script separa el proceso hijo del padre y lo asigna al proceso init :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
mark_infinite
fuente