Mueva un programa iniciado en la pantalla de GNU a otro terminal

21

Quiero terminar una instancia de GNU screenmientras preserva el proceso que se ejecuta dentro de él.

Entonces abrí mi programa regular de emulador de terminal y ejecuté la pantalla. Luego usé esa instancia de screenpara ejecutar ./script_x.sh. Ahora, por cualquier razón, quiero dejar de usar, screensin embargo, script_x.shaún no he completado su tarea y no estoy dispuesto a perder mi progreso.

¿Puedo mantener vivo el proceso activo para continuar trabajando en él dentro de mi emulador de terminal normal?

voces
fuente
14
¿Realmente quieres matar la pantalla o quieres desconectarte de ella? La pantalla debe usarse para ejecutar un proceso en segundo plano para que pueda continuar en su sesión normal, también permite que las aplicaciones sigan ejecutándose después de cerrar sesión (por ejemplo, desconecte su sesión SSH). Siempre puede desconectarse de la pantalla, continuar en su sesión normal y retomar donde lo dejó en la sesión de pantalla. Su emulador de terminal no tiene nada que ver con esto.
BlueCacti
O simplemente cree otra pantalla dentro de la screensesión.
chrylis -on strike-
11
Esta pregunta huele como el problema XY .
Digital Chris
77
@ tjt263: usted dice que se arrepiente de usar la pantalla en primer lugar, entonces, ¿qué haría para mantener su proceso en ejecución si no hubiera usado la pantalla? Todavía puede hacer lo mismo con el proceso en la pantalla, pero la pantalla tiene la ventaja adicional de que puede desconectarse y dejar que su proceso se ejecute sin problemas.
Johnny
@DigitalChris Podría hacerlo ahora. Siento que el título original fue probablemente más relevante. Hay 3 puntos distintos: estaba ejecutando un programa dentro screen. Quería dejar de usar screen. No quería detener el programa que se estaba ejecutando dentro screen. Eso es. No sé cómo aclarar la situación o expresarla de manera más simple que esto.
voces

Respuestas:

31

TLDR: Respuesta práctica: No.

Respuesta más larga:

En teoría puedes. Si comenzó algo así nohup myprog &desde dentro de la pantalla, continuará ejecutándose. Ignorará una señal de bloqueo y no tendrá ninguna entrada, pero en teoría podría continuar trabajando con ella.

En la práctica este no es el caso. Por lo tanto, a menos que desee adjuntar un depurador al proceso en ejecución y reescribir sus identificadores de archivo y asegurarse de que el proceso maneja las señales -1 cuando cierra la pantalla ... la respuesta es no.

Si está listo para hacer esto, tengo un marcador en casa que apunta a [SU] donde alguien hizo exactamente eso . Guardado para la genialidad, no porque sea fácil y trivial de hacer.

Hennes
fuente
Tenga en cuenta que la pregunta se ha editado masivamente desde su respuesta.
Chrylis -on strike-
Desconectar un proceso es bastante sencillo: se trata de establecer grupos de procesos (con disowno en un nivel inferior) para que no SIGHUPse envíe ninguno cuando el proceso principal fallezca. Volver a conectar E / S es otra cosa: es donde entra el depurador.
alexis
No es necesario nohupsi se encuentra en una cáscara de control de trabajos (como bash, ksh, csh, zsh, ash, etc.). Si todavía está utilizando un shell de control que no es de trabajo como Bourne, shtal vez sea hora de actualizar.
pollitos
23

Puede intentar usar reptyrpara volver a conectar la aplicación que ya se está ejecutando en un terminal diferente. Sin embargo, tiene algunos problemas con el proceso de envío a segundo plano.

Acabo de probarlo (comenzar en el htopinterior screen, reptyra otra terminal, matar screen), y parecía funcionar bien. Aún así, es una solución realmente hacky, así que no hay garantías.

una tierra
fuente
1
Menos hacky que usar gdb :)
Hennes
14

Sí (si "matar" no es realmente matar), para eso es exactamente para qué sirve la pantalla. Debe consultar el manual y probar cuál de estos se ajusta a sus necesidades:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

Entonces, lo que necesitará son las opciones de línea de comando -D / -d -R / -r de la pantalla, dependiendo de su elección.

Gombai Sándor
fuente
1
Esto no responde la pregunta. El OP no quiere separarse de la pantalla, quieren terminar el proceso de la pantalla.
Guntram Blohm apoya a Monica el
66
Sí, escribió eso, pero no estoy seguro de que haya preguntado qué quería.
Gombai Sándor
11
@GuntramBlohm No está nada claro que el OP entienda cómo funciona la pantalla, y este es el efecto deseado más probable.
chrylis -on strike-
2
¿Sabe que la pantalla no es un terminal diferente de xterm sino una capa (un pseudo terminal) que se puede conectar a su terminal real (vterm, xterm, terminator, (m) rxvt, any) después de desconectarlo de cualquier otro terminal? Y la pantalla es lo que mantiene su proceso ejecutándose uno lo inició dentro de la pantalla (y lo hace bien). Si matas (realmente matas) la pantalla, entonces sacas la alfombra de debajo de tu proceso ... Simplemente no veo ninguna buena razón por la que lo harías.
Gombai Sándor
1
@ GombaiSándor: Una razón para querer hacer eso sería hacer que el proceso hable directamente a un terminal para pasar por capacidades que la pantalla no conoce. Por ejemplo, una vez pirateé mi propia versión de xterm para hacer que todas las teclas de función extrañas en mi teclado enviaran secuencias de escape que incluían el teclado X11 y el estado del modificador completo, en lugar de tratar de fingir que era un VT102, y luego comencé a instalar combinaciones de teclas para ellos en emacs. Esas secuencias no pasarían por la pantalla ilesas.
Henning Makholm