desarrollo-web-br-bd.com

¿Cómo conecto un terminal a un proceso separado?

He separado un proceso de mi terminal, así:

$ process &

Ese terminal ahora está cerrado desde hace mucho tiempo, pero process todavía se está ejecutando y quiero enviar algunos comandos al stdin de ese proceso. ¿Es eso posible?

107
Rogach

Sí lo es. Primero, cree una tubería: mkfifo /tmp/fifo. Use gdb para adjuntar al proceso: gdb -p PID

Luego cierre stdin: call close (0); y ábralo de nuevo: call open ("/tmp/fifo", 0600)

Finalmente, escriba (desde un terminal diferente, ya que gdb probablemente se bloqueará):

echo blah > /tmp/fifo

117
Ansgar Esztermann

Cuando el terminal original ya no es accesible ...

reptyr podría ser lo que desea, vea https://serverfault.com/a/284795/187998

Cita a partir de ahí:

Echa un vistazo a reptyr , que hace exactamente eso. La página de github tiene toda la información.

reptyr: una herramienta para "volver a poner" programas.

reptyr es una utilidad para tomar un programa en ejecución existente y adjuntarlo a una nueva terminal. ¿Comenzó un proceso de larga duración sobre ssh, pero tiene que irse y no quiere interrumpirlo? Simplemente inicie una pantalla, use reptyr para capturarla, y luego cierre la sesión ssh y diríjase a casa.

USO

reptyr PID

"reptyr PID" tomará el proceso con id PID y lo conectará a su terminal actual.

Después de adjuntar, el proceso tomará la entrada y escribirá la salida en el nuevo terminal, incluidos ^ C y ^ Z. (Desafortunadamente, si lo pone en segundo plano, aún tendrá que ejecutar "bg" o "fg" en la terminal anterior. Es probable que esto sea imposible de solucionar de manera razonable sin parchear su Shell).

34
NiKiZe

Estoy bastante seguro de que no puedes.

Verificar usando ps x. Si un proceso tiene un ? as controlando tty , ya no puede enviarle entradas.

9942 ?        S      0:00 tail -F /var/log/messages
9947 pts/1    S      0:00 tail -F /var/log/messages

En este ejemplo, puede enviar entradas a 9947 haciendo algo como echo "test" > /dev/pts/1. El otro proceso (9942) no es accesible.

La próxima vez, puede usar pantalla o tmux para evitar esta situación.

12
andcoz

[~ # ~] editar [~ # ~] : Como dijo Stephane Gimenez, no es tan simple. Solo le permite imprimir en un terminal diferente.

Puede intentar escribir en este proceso usando /proc. Debe ubicarse en /proc/ pid /fd/0, así que un simple:

echo "hello" > /proc/PID/fd/0

deberías hacerlo. No lo he probado, pero debería funcionar, siempre y cuando este proceso todavía tenga un descriptor de archivo válido stdin. Puedes consultarlo con ls -l on /proc/ pid /fd /.

  • si es un enlace a/dev/null => está cerrado
  • si es un enlace a/dev/pts/X o un socket => está abierto

Consulte Nohup para obtener más detalles sobre cómo mantener los procesos en ejecución.

6
Coren

Acaba de terminar la línea de comando con & no separará completamente el proceso, solo lo ejecutará en segundo plano. (Con zsh puede usar &! para separarlo realmente, de lo contrario debe hacerlo disown más tarde).

Cuando un proceso se ejecuta en segundo plano, ya no recibirá información de su terminal de control. Pero puede enviarlo de nuevo al primer plano con fg y luego volverá a leer la entrada.

De lo contrario, no es posible cambiar externamente sus descriptores de archivo (incluido stdin) o volver a conectar un terminal de control perdido ... a menos que use herramientas de depuración (vea Respuesta de Ansgar , o eche un vistazo a retty comando).

5
Stéphane Gimenez