Ver stdout / stderr do serviço systemd

144

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 o systemd.

Estou tentando rastrear onde está 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

Ao longo do aplicativo, eu saio para stdout e stderr.

Como posso ler a saída do meu daemon?

Editar:

Encontrei man systemd.exec , que mencionou a opção StandardOutput= , mas não sei como usá-la. Na página do manual:

StandardOutput=

Controls where file descriptor 1 (STDOUT) of the executed processes is connected to. Takes one of inherit, null, tty, syslog, kmsg, kmsg+console, syslog+console or socket.

If set to inherit the file descriptor of standard input is duplicated for standard output. If set to null standard output will be connected to /dev/null, i.e. everything written to it will be lost. If set to tty standard output will be connected to a tty (as configured via TTYPath=, see below). If the TTY is used for output only the executed process will not become the controlling process of the terminal, and will not fail or wait for other processes to release the terminal. syslog connects standard output to the syslog(3) system logger. kmsg connects it with the kernel log buffer which is accessible via dmesg(1). syslog+console and kmsg+console work similarly but copy the output to the system console as well. socket connects standard output to a socket from socket activation, semantics are similar to the respective option of StandardInput=. This setting defaults to inherit.

Isso significa que essas são minhas únicas opções? Eu gostaria, por exemplo, de colocar a saída em /dev/shm ou algo assim. Eu 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 irei remover a maioria dos logs e alterar a saída para o syslog.

    
por beatgammit 09.09.2011 / 20:24

2 respostas

155

Atualizar

Como observa o mikemaccana, o jornal do sistema agora é o dispositivo de registro padrão para a maioria das distros. Para visualizar o stdout e o stderr de uma unidade do systemd, use o comando journalctl .

sudo journalctl -u [unit]

Resposta original

Por padrão, stdout e stderr de uma unidade do sistema são enviados para o syslog.

Se você estiver usando o sistema completo, isso será acessível via journalctl . No Fedora, deve ser /var/log/messages , mas o syslog irá colocá-lo onde suas regras dizem.

Devido à data do post, e assumindo que a maioria das pessoas que estão expostas ao systemd são via fedora, você provavelmente foi atingido pelo bug descrito aqui: link Ele tem uma boa explicação de como tudo funciona também =) (Este foi um bug no selinux-policy que fez com que mensagens de erro não fossem registradas, e foi corrigido em selinux-policy-3.10.0-58.fc16 )

    
por 30.11.2012 / 16:20
65

Resposta mais curta, mais simples e sem legado:

sudo journalctl -u [unitfile]

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

sudo journalctl --unit=myapp

Para acompanhar os registros em tempo real:

sudo journalctl -f -u myapp
    
por 17.02.2014 / 12:53