it-swarm-es.tech

¿Cómo puedo rechazar un proceso en ejecución y asociarlo a un nuevo shell de pantalla?

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?

164
levesque

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.

88
Andrew Yochum

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 .

67
jofel

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.

28
daisy

También hay una pequeña utilidad llamada retty que le permite volver a conectar los programas en ejecución a otro terminal.

21
adamg

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

19
Michael Mrozek

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>
9
yunzen

"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.

9
user2688272

Esto funcionó para mí:

  1. bg el proceso
  2. jobs -l encontrar número de proceso
  3. tmux iniciar el administrador de la ventana de Shell
  4. reptyr -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
1
kqw