Como faço um script de shell que envia saída para um processo?

11

Atualmente, estou executando um programa de console do servidor em uma tela porque preciso lê-lo e ocasionalmente enviar comandos.

Gostaria de executar o aplicativo como um daemon em segundo plano (iniciar / parar com o init).

Eu poderia tail -f do log, mas isso não me permitirá enviar informações para o processo.

Existe alguma maneira de configurar isso para que eu possa ler e enviar dados, mas ainda assim executá-lo em segundo plano?

Eu também gostaria de poder enviar entrada para o daemon a partir de diferentes processos (um shell script que poderia enviar um comando "Stop \ n", por exemplo).

    
por Bill K 22.12.2010 / 21:03

1 resposta

9

Ler de um pipe, gravar em um arquivo

Se você quiser que o daemon leia a entrada produzida por algum processo arbitrário, será necessário conectar esse processo a um pipe. Aqui o processo arbitrário é você ecoando comandos, e ele vai rodar em um contexto diferente. Portanto, crie um pipe nomeado (geralmente chamado de fifo em contextos unix).

mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log

E apenas escreva comandos para o pipe:

echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo

É improvável que isso funcione como está: há uma boa chance de que o daemon saia quando vir um final de arquivo em sua entrada padrão, o que acontece assim que o primeiro processo que grava no pipe termina. Você pode usar tail -f para evitar esse problema.

</var/run/daemon.fifo tail -c +1 -f | {
  echo $$ >/var/run/daemon.pid
  exec /path/to/daemond --option >daemon.log
}

Com algumas implementações de tail , você pode ser mordido pelo buffer: o processo tail esperará até acumular bytes suficientes para emitir alguma saída. Eu não acho que isso é solucionável na caixa de ferramentas POSIX; Se isso é um problema, use um programa C ou Perl ou Python trivial. Tanto quanto eu posso dizer o tail de GNU coreutils (como encontrado no Linux e em outros lugares) é seguro a este respeito.

Quando você parar o daemon, echo >/var/run/daemon.fifo eliminará o processo tail .

Iniciando o programa dentro da tela

Em vez de invocar o daemon diretamente de seu gerenciador de serviços (você está realmente usando apenas o init do SysV, ou algo adicional como scripts de wrapper ou Upstart?), invoque

screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option

Como o daemon não é um processo filho do gerenciador de serviços, é necessário enviar um sinal para o processo correto. Como fazer isso depende exatamente de como o daemon é iniciado e por quê.

tecnicamente possível para anexar um processo em execução a um terminal, mas há um risco de você travar o programa, então isso definitivamente está fora de um sistema de produção.

A opção -L faz a tela escrever tudo o que aparece em sua janela em um arquivo. O nome do arquivo é dado em daemon.screenrc com a diretiva logfile .

    
por 22.12.2010 / 21:31