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.
/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 usar ttyS0
ou semelhante para exibir a saída na tela).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/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.