Tengo un programa en ejecución en un SSH Shell. Quiero pausarlo y poder deshacer su ejecución cuando regrese.
Una forma en que pensé en hacer eso fue transferir su propiedad a un Shell de pantalla, manteniéndolo funcionando allí.
¿Hay una manera diferente de proceder?
Usar GNU screen
es su mejor apuesta.
La pantalla de inicio se ejecuta cuando inicia sesión por primera vez: ejecuto screen -D -R
, ejecute su comando y desconéctelo o suspenda con CTRL-Z
y luego desconectarse de la pantalla presionando CTRL-A
luego D
.
Cuando vuelva a iniciar sesión en la máquina, vuelva a conectarse ejecutando screen -D -R
. Estarás en el mismo Shell que antes. Puede ejecutar jobs
para ver el proceso suspendido si lo hizo, y ejecutar %1
(o el trabajo respectivo #) para ponerlo en primer plano nuevamente.
Puede revocar la "propiedad" del programa desde el Shell con el disown
incorporado:
# press Ctrl+Z to suspend the program
bg
disown
Sin embargo, esto solo le dice al Shell que no envíe una señal SIGHUP
al programa cuando el Shell salga. El programa retendrá cualquier conexión que tenga con el terminal, generalmente como flujos de entrada, salida y error estándar. No hay forma de volver a conectarlos a otra terminal. ( Pantalla funciona emulando un terminal para cada ventana, por lo que los programas se adjuntan a la ventana de la pantalla).
Es posible volver a conectar los descriptores de archivo a un archivo diferente conectando el programa en un depurador (es decir, usando ptrace
) y haciendo que llame a open
, dup
y close
. Hay algunas herramientas que hacen esto; Este es un proceso complicado y, a veces, bloquean el proceso. Las posibilidades incluyen (enlaces recopilados de las respuestas a ¿Cómo puedo rechazar un proceso en ejecución y asociarlo a un nuevo shell de pantalla? y ¿Puedo Nohup/pantalla un proceso ya iniciado? =):
Para mover un proceso entre terminales o para volver a conectar un desautorizado, puede usar p. reptyr .
Mi solución favorita es usar tmux
, puede separar la sesión y volver a conectarla en otro terminal.
Cuando se separó de la sesión anterior, puede cerrar la terminal de manera segura; luego use tmux attach
para volver a la sesión, incluso si ha cerrado sesión.
También hay una pequeña utilidad llamada retty que le permite volver a conectar los programas en ejecución a otro terminal.
No lo uso regularmente, pero neercs afirma respaldar esto. Es un programa similar a screen
con características sofisticadas diversas como una mejor administración de paneles, pero lo principal que ofrece es la capacidad de importar un proceso en un panel
Si solo desea pausarlo y reiniciarlo después, puede usar kill
con la señal STOP
o CONT
.
Primero descubra los procesos PID con
$ ps aux
Luego envíe las señales a ese PID que figura en el proceso
$ kill -STOP <PID>
$ kill -CONT <PID>
"injcode" de ThomasHabets parece ser exactamente lo que necesito:
https://github.com/ThomasHabets/injcode
El programa injcode permite que se inyecte código arbitrario en un proceso en ejecución, ya sea que usted lo supiera de antemano o no y estuviera ejecutando screen o tmux
Desde el archivo Léame:
Ejemplo 1: mover irssi de una terminal a otra
Quizás moverlo a una pantalla.
Primero inicie irssi en una terminal.
Ejecute injcode en otra terminal: $ injcode -m retty
Irssi ahora debería ser trasladado a la segunda terminal, incluyendo tener una nueva terminal de control.
Esto funcionó para mí:
bg
el procesojobs -l
encontrar número de procesotmux
iniciar el administrador de la ventana de Shellreptyr -L PROCESSNUMBER
reptyr
's -L
fue necesario para que esto funcione:
-L Like '-l', but also redirect the child's stdio to the slave.
por este error:
$ reptyr 30622
[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied
Y con -L
$ reptyr -L 30622
Opened a new pty: /dev/pts/4