Você pode tentar escrever no diretório / pid do proc. Digamos que o pid de seus daemons é 2000, tente gravar em / proc / 2000 / fd / 0
Estou em uma caixa Ubuntu 10.04 e iniciei um servidor em segundo plano (myserver &) por ssh. Ele está funcionando bem, mas eu preciso de uma maneira de chegar no stdin do servidor, pois a única maneira de controlar o servidor é através desse método.
Existe alguma maneira de chegar ao stdin de um processo já em execução para que eu possa escrever para ele (e esperançosamente ler seu stdout)? Obviamente, se eu fosse fazer isso agora, eu começaria com um FIFO redirecionando para stdin, mas infelizmente é um pouco tarde para isso agora.
Alguma idéia?
Você poderia iniciar seu servidor com um pipe nomeado (fifo) como sua entrada:
mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &
O cat > /tmp/srv-input &
é importante para evitar que seu servidor receba um EOF. Pelo menos um processo deve ter o fifo aberto por escrito para que seu servidor não receba um EOF. O PID deste comando é salvo no arquivo /tmp/srv-input-cat-pid
para o último kill.
No seu caso em que você já iniciou seu servidor, você precisa usar um depurador como gdb
para anexar ao seu processo para redirecionar seu stdin
para o fifo:
gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)
E então faça algo como abaixo para enviar a entrada para o seu servidor (em outra janela de terminal, se necessário):
echo "command" > /tmp/srv-input
Para enviar um EOF para o seu servidor, você precisa eliminar o processo cat > /tmp/srv-input
cujo PID foi salvo no /tmp/srv-input-cat-pid file
.
No caso do GDB, basta sair do GDB e o EOF será enviado.
O mesmo que acima, mas "gato" não funcionou para mim. O arquivo recebeu EOF e terminou depois de enviar um comando.
Isso funcionou para mim:
#!/bin/bash
mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &