Atualmente estou desenvolvendo um aplicativo de hospedagem de servidor (principalmente para mim / para fins de aprendizagem) e tudo funciona muito bem e tudo mais, não sei quantos de vocês estão familiarizados com Counter-Strike em geral, mas eu inicio meu servidor e tudo mais está ok, mas eu me separo dele (tudo isso está escrito em Node.js), então não posso usar screen
ou nada, mas basicamente se eu quisesse mudar o nível no servidor, eu seria capaz de digitar changelevel de_dust2
ou algo assim se eu fosse iniciar o servidor manualmente, mas como estou desconectado, não tenho como dar nenhum comando a esse processo.
Eu li sobre FIFOs e o uso de soquetes Unix, mas tudo o que parece fazer é ecoar para mim, não tenho certeza se perdi a compreensão dos FIFOs, mas pensei que poderia
mkfifo /tmp/server
echo "./startserver" > /tmp/server &
e mais tarde se eu quisesse
echo "changelevel de_dust2" > /tmp/server
desculpe se não estou claro, basicamente tenho um processo daemon para o qual desejo enviar comandos.
Responder1
Você deve certificar-se de que seu processo "daemon" leia o pipe.
mkfifo /tmp/server
./startserver < /tmp/server &
sleep 10000 > /tmp/server &
Mais tarde, tudo o que você escrever /tmp/server/
aparecerá na startserver
entrada padrão de, por exemplo:
echo "changelevel de_dust2" > /tmp/server
Obs: o sleep
comando é necessário para manter o pipe aberto, pois cada echo
comando tentará fechá-lo quando terminar, possivelmente encerrando o startserver
.
Responder2
Três maneiras vêm à minha mente. Contanto que o processo daemon use stdin/out, não deverá ser um problema se comunicar com ele.
se você usar
screen
,tmux
ou solução semelhante, não será necessário desconectar o servidor. Você pode mantê-lo "conectado" com segurança ao console e desconectar a própria tela.você pode usar
/proc/N/fd/{0,1}
para comunicação, desde que tenha os direitos adequados, onde N é o PID do deamon, fd0 geralmente é o stdin e fd1 é o stdout do processo N.sua abordagem com um pipe nomeado (FIFO) está correta em essência, mas você está fazendo isso apenas pela metade. O que você fez foi alterar o stdout do processo para o pipe, o que significa que tudo o que é impresso no stdout pelo daemon é gravado no pipe de onde você pode extraí-lo, digamos, cat. O tubo é half-duplex, o que significa que só pode conectar uma entrada com uma saída. O que você precisa são de dois tubos, um para entrada e outro para saída. Então, tudo o que você enviar para o daemon por meio de um canal chegará lá enquanto a resposta vai pelo outro canal de volta para outro programa que irá ler o canal.
Suponha que existam dois tubos pin
e pout
. Você corre:
daemon < pin > beicinho
Então você deve executar algo como
beicinho de gato e gato> alfinete
para se comunicar. Este é um mau exemplo, pode ter condições de corrida, pois é assíncrono, mas espero que você tenha entendido.