Leia de um pipe, grave em um arquivo
Se você deseja que o daemon leia as entradas produzidas por algum processo arbitrário, é necessário conectar esse processo a um canal. Aqui, o processo arbitrário é você ecoando comandos, e será executado 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 basta escrever comandos no canal:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
No entanto, é improvável que funcione como está: existe uma boa chance de o daemon sair quando vê um final de arquivo em sua entrada padrão, o que acontece assim que o primeiro processo que grava no canal 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
}
Em algumas tail
implementações, você pode ser mordido pelo buffer: o tail
processo aguardará até que acumule bytes suficientes para emitir alguma saída. Eu não acho que isso possa ser solucionado na caixa de ferramentas POSIX; se isso for um problema, use um programa trivial C, Perl ou Python. Até onde eu sei, o tail
coreutils do GNU (como encontrado no Linux e em outros lugares) é seguro a esse respeito.
Quando você para o daemon, echo >/var/run/daemon.fifo
mata o tail
processo.
Iniciando o programa dentro da tela
Em vez de chamar o daemon diretamente do seu gerente de serviço (você realmente está usando apenas o SysV init ou algo adicional como scripts de wrapper ou Upstart?), Chame
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Como o daemon não será um processo filho do gerenciador de serviços, você deve enviar um sinal para o processo correto. Como fazer isso depende exatamente de como o daemon é iniciado e por quê.
É tecnicamente possível anexar um processo em execução a um terminal, mas há o risco de você travar o programa, portanto, isso definitivamente está fora do sistema de produção.
A -L
opção faz com que a tela grave tudo o que aparece em sua janela em um arquivo. O nome do arquivo é fornecido daemon.screenrc
com a logfile
diretiva.