Exibir stdout / stderr do serviço systemd

175

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 via TTYPath=, 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 de StandardInput=. 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/shmou 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.

beatgammit
fonte
Você já tentou verificar /var/log/sysloga saída? A maioria dos sistemas fará o logon, /var/log/então eu começaria verificando lá. Você pode usar greppara procurar texto se souber a saída: grep "my output" /var/logdeve fazer o truque.
Sbtkd85 9/09/11
@ sbtkd85 - Bem, eu não tenho /var/log/syslog, mas /var/log/messagesfaz 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 ...
beatgammit
Por que não tentar configurar StandardOutput=ttypara poder ver o que está acontecendo quando você inicia o daemon. Ele deve emitir o terminal (pode ser necessário usar ttyS0ou semelhante para exibir a saída na tela).
precisa saber é o seguinte
3
Os operadores de redirecionamento de IO padrão não devem funcionar nesse contexto. Algo comoExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal
O que realmente está abusando da sua CPU? É systemd, seu serviço ou sistema (por exemplo, gerando novas cópias do serviço porque o systemd ficou louco)?
Peterph

Respostas:

184

Atualizar

Como mikemaccana observa, o diário systemd agora é o dispositivo de registro padrão para a maioria das distribuições. Para visualizar o stdoute stderrde uma unidade systemd, use o journalctlcomando

sudo journalctl -u [unit]

Resposta original

Por padrão stdoute stderrde 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/messagesmas 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)

Matt
fonte
5
Observe que usar o mecanismo de log padrão como este não criará logs persistentes por padrão. Para fazer isso, você precisará criar / var / log / journal e depois executarsudo systemctl restart systemd-journald
mlissner 8/15
1
que facilidade e prioridade do syslog?
Jrwren
2
Isso funcionou para mim: StandardOutput=syslog+consolee StandardError=syslog+consoledepois 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)
gregn3
2
-ffoi útil para mim. Seguido o log como ocorrem alterações (caso de uso estava seguindo servidor minecraft que foi executado como um daemon)
blaughw
2
Isso está me deixando louco ... Em um trecho padrão do Debian, o journalctl não me mostra nenhuma saída padrão. Eu até uso /usr/bin/stdbuf -oL <cmd>e um explícito StandardOutput=journal. Nada ainda.
jlh
81

Resposta mais curta, mais simples e não legada:

sudo journalctl -u [unitfile]

Onde [unitfile] é o .servicenome do systemd . Por exemplo, para ver mensagens de myapp.service,

sudo journalctl --unit=myapp

Para acompanhar os logs em tempo real:

sudo journalctl -f -u myapp
mikemaccana
fonte
4
Observe que você pode precisar sudose receber um No journal files founderro.
bigjosh
5
syslog não é legado ...
Miles Rout
2
Está nas distribuições atuais do Linux. Você pode realmente gostar do syslog, mas isso não muda com o que eles são enviados.
Mikemaccana
1
Certo. E também usa syslog. Meu argumento não era que o systemd não é usado, mas esse syslog não é legado.
labirinto
6
@JECompton se todo o logon nas distribuições atuais do Linux usar journald, e o syslog não for necessário e usado apenas para compatibilidade, então logicamente se segue que o syslog é legado.
Mikemaccana 13/03/19