Tengo un programa en ejecución en un shell SSH. 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 así en funcionamiento.
¿Hay una manera diferente de proceder?
ssh
terminal
gnu-screen
job-control
disown
levesco
fuente
fuente
Respuestas:
Usar GNU
screen
es tu mejor apuesta.Pantalla de inicio de funcionamiento cuando la primera conexión - corro
screen -D -R
, ejecutar el comando, y, o bien desconectar o suspender conCTRL-Z
y luego desconecto de pantalla pulsandoCTRL-A
a continuaciónD
.Cuando vuelva a iniciar sesión en la máquina, vuelva a conectarse ejecutando
screen -D -R
. Estarás en el mismo caparazón que antes. Puede ejecutarjobs
para ver el proceso suspendido si lo hizo, y ejecutar%1
(o el trabajo correspondiente #) para ponerlo en primer plano nuevamente.fuente
Puede revocar la "propiedad" del programa desde el shell con el
disown
incorporado:Sin embargo, esto solo le dice al shell que no envíe una
SIGHUP
señal 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. (La 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 llameopen
,dup
yclose
. Hay algunas herramientas que hacen esto; Este es un proceso complicado, y a veces bloquean el proceso. Las posibilidades incluyen (enlaces recogidos de respuestas a ¿Cómo puedo renegar de un proceso en ejecución y asociarlo a un nuevo shell pantalla? Y ¿Puedo nohup / pantalla de un proceso iniciado ya-? ):fuente
disown
elimina el proceso de la lista de control de trabajos.disown -h
?fg
okill
no, y ver si termina por sí solo.bzcat a.bz2 | grep text
)? El hombrereptyr
dice que no admite mover los procesos con niños.Para mover un proceso entre terminales o volver a conectar un desautorizado, puede usar, por ejemplo, reptyr .
fuente
screen
respuesta aceptada es, por supuesto, ideal, en realidad no responde la pregunta, que específicamente solicita una forma de mover un proceso actualmente en ejecuciónscreen
o similar. También vea esta respuesta: serverfault.com/a/284795Mi solución favorita es usar
tmux
, podría 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 la sesión.fuente
También hay una pequeña utilidad llamada retty que le permite volver a conectar los programas en ejecución a otro terminal.
fuente
No lo uso con regularidad, pero Neercs afirma apoyar esto. Es un
screen
programa similar con varias características sofisticadas, como una mejor administración de paneles, pero lo principal que ofrece es la capacidad de importar un proceso en un panelfuente
ptrace
), pero no solo manipula los descriptores de archivo, sino que bifurca el proceso. Es capaz de agarrarfind /
, pero bloqueó una fiesta interactiva.Si solo quieres pausarlo y reiniciarlo después, puedes usarlo
kill
conSTOP
oCONT
señal.Primero descubra los procesos PID con
Luego envíe las señales a ese PID listado en el proceso
fuente
"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:
fuente
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
era necesario para conseguir que esto funcione:-L Like '-l', but also redirect the child's stdio to the slave.
por este error:
Y con -L
fuente