Eu tenho um daemon personalizado que é gerenciado pelo iniciante no meu servidor Ubuntu. Funciona perfeitamente, exceto que eu preciso capturar (log) a saída do daemon. A página oficial das estrofes diz que eu posso usar console logged
isso, mas em qual arquivo ele faz logon?
Também li que nãoconsole logged
é mais uma estrofe válida . Atualmente, estou usando 0.3.9 (Hardy), mas vou atualizar para 0.6.x (Lucid) em alguns meses. Se console logged
, de fato, não funcionará com versões posteriores, o que devo usar?
Respostas:
Esse trecho direcionará a saída do seu serviço para o criador de logs, enquanto ainda permite que você execute o processo do serviço (substituindo assim o processo do shell) para que o iniciante não fique confuso. Ele também garante que o processo do criador de logs seja reparado para iniciar, por isso não é um filho do seu serviço e evita deixar cruft parado no sistema de arquivos, mesmo que seja necessário criar um fifo temporariamente.
Veja como funciona:
mkfifo /tmp/myservice-log-fifo
simplesmente cria o arquivo especial fifo (também conhecido como pipe). Digiteman 7 fifo
para mais informações.( logger ... </tmp/myservice-log-fifo & )
inicia a leitura do registrador do fifo, em segundo plano. As parênteses fazem com que o processo do criador de logs seja reparado para iniciar, em vez de permanecer um filho do processo atual do shell.exec >/tmp/myservice-log-fifo
redireciona o stdout do shell atual para o fifo. Agora temos um descritor de arquivo aberto para esse fifo e não precisamos mais da entrada do sistema de arquivos ...rm /tmp/myservice-log-fifo
então vamos removê-lo.exec myservice 2>/dev/null
simplesmente executa o serviço da maneira usual. O Stdout já está no fifo e isso não muda quando o novo programa é executado.UPDATE:
set -e
não é necessário, pois o Upstart executa scripts com esta opção por padrão (consulte http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )fonte
set -e
?set -e
faz com que o script saia imediatamente se algum comando falhar. Sem essa linha, o script continuaria executando comandos subseqüentes inutilmente (e possivelmente perigosamente).exec 2>&1
acima darm
linha e remova-a2>/dev/null
da última linha.Para versões recentes do Ubuntu (12.04+), basta usar
E a saída do daemon (STDOUT & STDERR) será anexada a
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
fonte
Se você usar a
console output
sub - rotina e canalizar a saída do seu script paralogger
(a interface de comando do shell para o módulo de log do sistema syslog (3)), isso funcionará.Por exemplo
registrará em
/var/log/messages
Por exemplo
registrará
/var/log/messages
e marcará cada mensagem commy-script
logger --help
para opções de uso do criador de logs.(Estou na Amazon Linux AMI, que é baseada no Centos 5.x; YMMV)
fonte
logger
, não no processo que você realmente deseja que ele gerencie.Não consegui o
mkfifo
truque para funcionar satisfatoriamente; ele não pareceu capturar o stderr e as tentativas de redirecionamento fizeram com que o Upstart fosse liberado sem erros.Ele também tem um efeito colateral lamentável de fazer com que o
logger
processo permaneça como filhoinit
, de modo que as informações sobre quem é o proprietário do criador de logs são perdidas e qualquer pessoa que ainda não esteja ciente dissomkfifo
pode assumir que é um processo pendente que pode ser morto.Em vez disso, acabei com a seguinte solução, que resolve todos esses problemas. Faz com
logger
que se torne um processo filho, preservando o serviço como o processo raiz. Infelizmente, isso exige execuçãobash
, mas parece sujo.Isso usa um truque que redireciona stdout e stderr para um comando. Como executamos o serviço dentro do
bash
comando, isso tem o efeito colateral de substituir o shell e fazer do bash magicamente um processo filho do serviço, conforme mostrado porps aufxw
:Por alguma razão, o comando acima deve ser envolvido em a
bash -c
. Presumo que isso ocorra porque o Upstart apenas finge executar seu script via Bash, mas na verdade não é. Se alguém puder sugerir uma maneira de evitar o shell bash extra, isso seria incrível.fonte
exec bash -l << EOF
isso sem perdas.Isso é feio, mas até agora o melhor que encontrei
exec / caminho / para / servidor >> /tmp/upstart.log 2> & 1
fonte
Você também pode redirecionar a saída para o syslog, por exemplo
No entanto, o pipeline pode fazer com que o inicio confunda o PID do processo de log com o PID do daemon.
fonte
expect fork
ouexpect daemon
estrofe. Ou você poderiacat
colocar o arquivo pid na mensagem de log, caso contrário, eu acho.Outra alternativa é usar tee como:
para obter o arquivo inicial e a saída do syslog
fonte