Eu criei um arquivo de serviço systemd simples para um aplicativo personalizado. O aplicativo funciona bem quando eu o executo manualmente, mas minha CPU fica no máximo quando eu o executo com systemd.
Estou tentando rastrear onde está o meu problema, mas não sei onde encontrar a saída (ou como configurar o systemd para colocar a saída em algum lugar).
Aqui está o meu arquivo de serviço:
[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target
[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always
[Install]
WantedBy=multi-user.target
Em todo o aplicativo, eu produzo para stdout e stderr.
Como posso ler a saída do meu daemon?
Editar:
Eu encontrei man systemd.exec
, que mencionou a StandardOutput=
opção, mas não tenho certeza de como usá-lo. Na página do manual :
StandardOutput=
Controla onde o descritor de arquivo 1 (STDOUT) dos processos executados está conectado. Adota um entre herdar , nulo , tty , syslog , kmsg , kmsg + console , syslog + console ou soquete .
Se configurado para herdar, o descritor de arquivo da entrada padrão será duplicado para a saída padrão. Se definido como nulo , a saída padrão será conectada
/dev/null
, ou seja, tudo será gravado nela. Se definido como tty , a saída padrão será conectada a um tty (conforme configurado viaTTYPath=
, veja abaixo). Se o TTY for usado para saída, apenas o processo executado não se tornará o processo de controle do terminal e não falhará ou esperará que outros processos liberem o terminal. O syslog conecta a saída padrão ao criador de logs do sistema syslog (3). O kmsg conecta-o ao buffer de log do kernel, acessível através do dmesg (1). syslog + console e kmsg + consolefuncione da mesma forma, mas copie a saída para o console do sistema também. socket conecta a saída padrão a um soquete da ativação do soquete, a semântica é semelhante à respectiva opção deStandardInput=
. O padrão desta configuração é herdar.
Isso significa que essas são minhas únicas opções? Eu gostaria, por exemplo, de colocar saída /dev/shm
ou algo assim. Suponho que eu poderia usar um soquete de domínio Unix e escrever um ouvinte simples, mas isso parece um pouco desnecessário.
Eu só preciso disso para depuração e provavelmente terminarei removendo a maioria dos logs e alterarei a saída para syslog.
fonte
/var/log/syslog
a saída? A maioria dos sistemas fará o logon,/var/log/
então eu começaria verificando lá. Você pode usargrep
para procurar texto se souber a saída:grep "my output" /var/log
deve fazer o truque./var/log/syslog
, mas/var/log/messages
faz o truque. O problema é que, de acordo com os logs, meu daemon falha no início, mas posso dizer que ele ainda está em execução porque possui um servidor HTTP e posso consultá-lo. Parece que o restante dos logs estão se perdendo ...StandardOutput=tty
para poder ver o que está acontecendo quando você inicia o daemon. Ele deve emitir o terminal (pode ser necessário usarttyS0
ou semelhante para exibir a saída na tela).ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Respostas:
Atualizar
Como mikemaccana observa, o diário systemd agora é o dispositivo de registro padrão para a maioria das distribuições. Para visualizar o
stdout
estderr
de uma unidade systemd, use ojournalctl
comandoResposta original
Por padrão
stdout
estderr
de uma unidade systemd são enviados para o syslog.Se você estiver usando o systemd completo, isso será acessível via
journalctl
. No Fedora, deve ser,/var/log/messages
mas o syslog o colocará onde suas regras dizem.Devido à data do post, e supondo que a maioria das pessoas que estão expostas a systemd são via fedora, você provavelmente foram atingidos pelo bug descrito aqui: https://bugzilla.redhat.com/show_bug.cgi?id=754938 Tem uma boa explicação de como tudo funciona também =) (Este foi um erro na selinux-policy que fazia com que as mensagens de erro não fossem registradas e foi corrigido
selinux-policy-3.10.0-58.fc16
)fonte
sudo systemctl restart systemd-journald
StandardOutput=syslog+console
eStandardError=syslog+console
depois disso toda a saída da minha unidade apareceu no journalctl. A configuração padrão estava errada, aparentemente. (Tal como DefaultStandardOutput em /etc/systemd/system.conf)-f
foi útil para mim. Seguido o log como ocorrem alterações (caso de uso estava seguindo servidor minecraft que foi executado como um daemon)/usr/bin/stdbuf -oL <cmd>
e um explícitoStandardOutput=journal
. Nada ainda.Resposta mais curta, mais simples e não legada:
Onde [unitfile] é o
.service
nome do systemd . Por exemplo, para ver mensagens demyapp.service
,Para acompanhar os logs em tempo real:
fonte
sudo
se receber umNo journal files found
erro.