Atualmente, estou executando um programa de console do servidor em uma tela porque preciso lê-lo e enviar ocasionalmente comandos.
Gostaria de executar o aplicativo como um daemon em segundo plano (inicie / pare com init).
Eu poderia tail -f
fazer o log, mas isso não me deixará enviar informações para o processo.
Existe alguma maneira de configurar isso para que eu possa ler e enviar entradas, mas ainda assim executá-las em segundo plano?
Também gostaria de poder enviar entrada para o daemon de diferentes processos (um script de shell que poderia enviar um comando "Stop \ n", por exemplo).
scripting
shell-script
tail
Bill K
fonte
fonte
Respostas:
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).
E basta escrever comandos no canal:
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.Em algumas
tail
implementações, você pode ser mordido pelo buffer: otail
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, otail
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 otail
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
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 é fornecidodaemon.screenrc
com alogfile
diretiva.fonte
stuff
comando da tela ). Mas você não precisa da sobrecarga (processamento, mas, principalmente, cognitiva) de um terminal aqui; um canal é quase o suficiente (basta com um pequeno processo de retransmissão para ignorar o final do arquivo). Você pode experimentar um pouco com<fifo cat
ou<fifo tail -f | cat
em um terminal eecho >fifo; echo >fifo
em outro terminal; Eu acho que você vai ficar bem.