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?
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
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).
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.
[~ # ~] 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 /.
Consulte Nohup para obtener más detalles sobre cómo mantener los procesos en ejecución.
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).