Estou usando um script init para executar um processo simples, iniciado com:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
O processo chamado $ DAEMON normalmente imprime informações de log em sua saída padrão. Tanto quanto posso dizer, esses dados não estão sendo armazenados em nenhum lugar.
Gostaria de escrever ou anexar o stdout de $ DAEMON a um arquivo em algum lugar.
A única solução que eu sei é dizer ao start-stop-daemon para chamar um shellscript em vez de $ DAEMON diretamente; o script chama $ DAEMON e grava no arquivo de log. Mas isso requer um script extra que, como modificar o próprio daemon, parece a maneira errada de resolver uma tarefa tão comum.
fonte
--start
por--stop
realmente funciona.start-stop-daemon --test (...)
?>>
vez de>
para anexar.Você precisa fazer:
Além disso, se você usar
--chuid
ou--user
, verifique se o usuário pode gravar/var/log
ou o existente/var/log/some.log
. A melhor maneira é fazer com que esse usuário possua um/var/log/subdir/
pensamento.fonte
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
solução também. Pensando no que faria... -c "exec $DAEMON..."
(adicionando o "exec") faria. Não coloque isso no prato agora, então não pode tentar.Parece que você deve poder usar agora o
--no-close
parâmetro ao começarstart-stop-daemon
a capturar a saída do daemon. Este novo recurso está disponível nodpkg
pacote desde a versão 1.16.5 no Debian:fonte
start-stop-daemon
. No entanto, a versão do openrc tem as opções-1
e-2
para redirecionar o stdout e o stderr, respectivamente.Com o openrc (que é o padrão no gentoo ou no linux alpino por exemplo)
start-stop-daemon
tem as opções-1
e-2
:Então você pode escrever:
fonte
Não é muito difícil capturar a saída do daemon e salvá-la no arquivo:
No entanto, esta solução pode estar abaixo do ideal para
logrotate
.Talvez seja melhor capturar a saída no syslog. No Debian, isso corresponderia ao comportamento dos serviços systemd. A seguinte tentativa direta de reescrever o exemplo acima está incorreta porque deixa para trás dois processos sem pai ("zumbi") (logger e daemon) depois de parar o daemon porque
start-stop-daemon
encerra apenas seu filho, mas não todos os descendentes:Para fazê-lo funcionar, precisamos de um invólucro que encerra suas crianças após o recebimento
duende :SIGTERM
destart-stop-daemon
. Há alguns:Nota:
uid=65534
é um usuárionobody
.Prós : funciona e é relativamente fácil.
daemon :Contras : 4 processos (supervisor
duende
, seu fork com privilégios eliminados (logger)su
e o próprio daemon); obrigatório--chroot
; Se o daemon terminar imediatamente (por exemplo, comando inválido),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
relate-o como iniciado com sucesso.Prós : 3 processos (supervisor
daemon
,su
e daemon si).Contras : difícil de gerenciar
$PIDFILE
devido a opções confusas de linha de comando do daemon ; Se o daemon terminar imediatamente (por exemplo, comando inválido),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
relate-o como iniciado com sucesso.pipexec ( o vencedor ):
Prós : 3 processa (supervisor
pipexec
,logger
e daemon si); Se o daemon terminar imediatamente (por exemplo, comando inválido),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
relate corretamente a falha.Contras : nenhum.
Esse é o vencedor - a solução mais fácil e organizada que parece estar funcionando bem.
fonte
Geralmente
start-stop-daemon
fecha os descritores de arquivo padrão ao executar em segundo plano. Na página do manual destart-stop-daemon
:Este funcionou para mim:
fonte
Citando uma lista de discussão antiga:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
fonte
Não tenho certeza se "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" fechará o descritor de arquivo do arquivo de log ... o que significa que se o seu daemon for executado para sempre, não tenho certeza esse logrotate ou outros mecanismos para limpar o espaço em disco funcionariam. Como é> em vez de >>, o comando sugerido também truncará os logs existentes na reinicialização. Se você deseja ver por que o daemon travou e é reiniciado automaticamente, isso pode não ser muito útil.
Outra opção pode ser "$ DAEMON | logger". logger é um comando que fará logon no syslog (/ var / log / messages). Se você também precisar do stderr, acho que poderia usar "$ DAEMON 1> & 2 | logger"
fonte
>>
geralmente é mais apropriado para daemons, embora isso implique que agora você deve criar uma regra de rotação de log!--no-close ... | logger
não funciona para mim (Debian 7.3, start-stop-daemon 1.16.12). O script start-stop-daemon não volta, embora / var / log / messages esteja preenchido :-). Eu tentei com e sem1>&2
.Supondo que seja bash (embora algumas outras conchas possam permitir isso também), a linha:
enviará toda a saída padrão futura para esse arquivo. Isso
exec
ocorre porque sem o nome de um programa, apenas faz alguma mágica de redirecionamento. Nabash
página do manual:O gerenciamento desse arquivo é outra questão, é claro.
fonte
start-stop-daemon
linha que a pergunta inicial mencionou?E se:
fonte