Estou em uma caixa do Ubuntu 10.04 e iniciei um servidor em segundo plano (myserver &) através do ssh. Ele está funcionando bem, mas preciso de uma maneira de acessar o 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 nele (e espero ler seu stdout)? Obviamente, se eu estivesse fazendo isso agora, começaria com um FIFO redirecionando para stdin, mas infelizmente é um pouco tarde para isso agora.
Alguma ideia?
linux
bash
background-process
stdin
Tajmorton
fonte
fonte
Respostas:
Você pode tentar escrever no diretório / proc pid. Digamos que o pid dos seus daemons seja 2000, tente escrever em / proc / 2000 / fd / 0
fonte
0
através de2
conjunto para o mesmo arquivo, que normalmente é um terminal virtual (algo como/dev/pty/...
). O comando então lê do FD0
e grava no FD1
e2
se comunica com o terminal virtual (por exemplo, através do SSH ou diretamente com o emulador do terminal). Se qualquer outro processo acessar esse arquivo (por exemplo, através/proc
), acontece exatamente a mesma coisa, ou seja, gravar nele grava no terminal e não no comando.Você pode iniciar o servidor com um pipe nomeado (fifo) como entrada:
A
cat > /tmp/srv-input &
é importante para evitar o servidor para receber 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/tmp/srv-input-cat-pid
arquivo para posterior morte.No seu caso em que você já iniciou seu servidor, é necessário usar um depurador, como o
gdb
anexo ao seu processo para redirecioná-lostdin
para o fifo:E, em seguida, faça algo como abaixo para enviar informações ao seu servidor (em outra janela do terminal, se necessário):
Para enviar um EOF ao seu servidor, você precisa interromper o
cat > /tmp/srv-input
processo no qual o PID foi salvo/tmp/srv-input-cat-pid file
.No caso do GDB, basta sair do GDB e o EOF será enviado.
fonte
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Isso vai manter o aberto da tubulação, bem ...tail
não trabalho, mas anexado este para terminar o trabalho:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-gato * `O mesmo que acima, mas 'gato' não funcionou para mim. O arquivo obteve EOF e terminou após o envio de um comando.
Isso funcionou para mim:
fonte