Escrevendo para o stdin do processo de segundo plano

24

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?

    
por tajmorton 08.10.2010 / 11:22

3 respostas

10

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

    
por 08.10.2010 / 11:33
26

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.

    
por 03.08.2011 / 15:06
2

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 &
    
por 16.11.2016 / 14:27