Estoy en un cuadro de Ubuntu 10.04 e inicié un servidor en segundo plano (myserver &) sobre ssh. Ha estado funcionando bien, pero necesito una forma de llegar al stdin del servidor, ya que la única forma de controlar el servidor es a través de este método.
¿Hay alguna forma de llegar al stdin de un proceso que ya se está ejecutando para poder escribirle (y espero leer su stdout)? Obviamente, si fuera a hacer esto ahora, comenzaría con un FIFO que redirige a stdin, pero desafortunadamente ya es un poco tarde para eso.
¿Algunas ideas?
linux
bash
background-process
stdin
Tajmorton
fuente
fuente
Respuestas:
Puede intentar escribir en su directorio / proc pid. Digamos que su pid de demonios es 2000, intente escribir a / proc / 2000 / fd / 0
fuente
0
través del2
conjunto en el mismo archivo, que normalmente es un terminal virtual (algo así como/dev/pty/...
). El comando luego lee desde FD0
y escribe en FD1
y se2
comunica con el terminal virtual (por ejemplo, a través de SSH o directamente con su emulador de terminal). Si algún otro proceso accede a ese archivo (por ejemplo, a través de/proc
), sucede exactamente lo mismo, es decir, escribir en él escribe en el terminal y no en el comando.Puede iniciar su servidor con una tubería con nombre (fifo) como entrada:
El
cat > /tmp/srv-input &
es importante evitar el servidor para recibir un EOF. Al menos un proceso debe tener el fifo abierto por escrito para que su servidor no reciba un EOF. El PID de este comando se guarda en el/tmp/srv-input-cat-pid
archivo para este último asesinato.En el caso de que ya haya iniciado su servidor, debe usar un depurador como
gdb
para adjuntarlo a su proceso para redirigirlostdin
al fifo:Y luego haga algo como abajo para enviar entradas a su servidor (en otra ventana de terminal si es necesario):
Para enviar un EOF a su servidor, debe eliminar el
cat > /tmp/srv-input
proceso cuyo PID se ha guardado en el/tmp/srv-input-cat-pid file
.En el caso de GDB, simplemente salga de GDB y se enviarán EOF.
fuente
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Esto también mantendrá la tubería abierta ...tail
no funciona, pero agregó esto para finalizar el trabajo:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `Igual que el anterior, pero 'gato' no funcionó para mí. El archivo obtuvo EOF y terminó después de enviar un comando.
Esto funcionó para mí:
fuente