No Linux, como posso executar um processo ao qual posso voltar mais tarde para dar um comando após desanexar?

No Linux, como posso executar um processo ao qual posso voltar mais tarde para dar um comando após desanexar?

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 screenou nada, mas basicamente se eu quisesse mudar o nível no servidor, eu seria capaz de digitar changelevel de_dust2ou 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 startserverentrada padrão de, por exemplo:

echo "changelevel de_dust2" > /tmp/server

Obs: o sleepcomando é necessário para manter o pipe aberto, pois cada echocomando 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.

  1. se você usar screen, tmuxou 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.

  2. 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.

  3. 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 pine 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.

informação relacionada