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
.