No Linux, como posso executar um processo para o qual eu possa voltar depois para dar um comando depois de desanexar

0

Atualmente, estou desenvolvendo um aplicativo de hospedagem de servidor (principalmente para mim / para fins de aprendizado) e tudo funciona muito bem. E não sei quantos de vocês estão familiarizados com o Counter-Strike em geral, mas eu começo servidor e tudo está ok, mas eu desanexar (Isso é tudo escrito em Node.js), então eu 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 lançar o servidor manualmente, mas desde que eu estou desanexado eu não tenho como dar a este processo qualquer comando.

Eu li sobre FIFO e usando sockets Unix, mas tudo que parece fazer é ecoar de volta para mim, eu não tenho certeza se sinto falta de entender FIFO, mas eu pensei que poderia

mkfifo /tmp/server echo "./startserver" > / tmp / server &

e mais tarde se eu quiser

echo "changelevel de_dust2" > /tmp/server

desculpe se não estou claro, basicamente tenho um processo daemon para o qual desejo enviar comandos.

    
por XCritics 03.06.2015 / 11:05

2 respostas

0

Você deve certificar-se de que o processo do "daemon" seja lido a partir do canal.

mkfifo /tmp/server
./startserver < /tmp/server &
sleep 10000 > /tmp/server &

Mais tarde, o que você escrever em /tmp/server/ aparece na entrada padrão de startserver , por exemplo:

echo "changelevel de_dust2" > /tmp/server

Nota: o comando sleep é necessário para manter o canal aberto, porque cada comando echo tentará fechá-lo quando terminar, possivelmente encerrando startserver .

    
por 03.06.2015 / 12:03
0

Três maneiras vêm à minha mente. Contanto que o processo daemon use stdin / out, não será um problema se comunicar com ele.

  1. se você usar screen , tmux ou solução semelhante, não será necessário desanexar o servidor. Você pode seguramente mantê-lo "conectado" ao console e desanexar a própria tela.

  2. você pode usar /proc/N/fd/{0,1} para comunicação, desde que você tenha direitos apropriados, onde N é o PID do deamon, fd0 é geralmente o stdin e fd1 é stdout do processo N.

  3. sua abordagem com um pipe nomeado (FIFO) está correta na essência, mas você está fazendo isso apenas pela metade. O que você fez foi mudar 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 pipe é half-duplex, o que significa que só pode conectar uma entrada a uma saída. O que você precisa são dois canais, um para entrada e outro para saída. Então, o que quer que você envie para o daemon através de um pipe chegará lá enquanto a resposta passa pelo outro pipe de volta para outro programa que lerá o pipe.

Suponha que haja dois pipes pin e pout . Você corre:

daemon < pin >pout

Então você deve executar algo como

cat pout & cat > pin

para se comunicar. Este é um mau exemplo, pode ter condições de corrida, já que é assíncrono, mas espero que você entenda.

    
por 03.06.2015 / 12:29