Ho creato un semplice file di servizio systemd per un'applicazione personalizzata. L'applicazione funziona bene quando la eseguo manualmente, ma la mia CPU viene massimizzata quando la eseguo con systemd.
Sto cercando di rintracciare il mio problema, ma non so dove trovare l'output (o come configurare systemd per posizionare l'output da qualche parte).
Ecco il mio file di servizio:
[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
Durante l'applicazione, ho eseguito l'output su stdout e stderr.
Come posso leggere l'output del mio demone?
Modificare:
Ho trovato man systemd.exec
, che ha menzionato l' StandardOutput=
opzione, ma non sono sicuro di come usarlo. Dalla pagina man :
StandardOutput=
Controlla dove è collegato il descrittore di file 1 (STDOUT) dei processi eseguiti. Prende uno di eredita , null , tty , syslog , kmsg , kmsg + console , syslog + console o socket .
Se impostato per ereditare, il descrittore di file dell'input standard viene duplicato per l'output standard. Se impostato su null , verrà collegato l'output standard
/dev/null
, vale a dire che tutto ciò che è scritto su di esso andrà perso. Se impostato su tty , l'uscita standard sarà collegata a un tty (come configurato tramiteTTYPath=
, vedere di seguito). Se TTY viene utilizzato per l'output, solo il processo eseguito non diventerà il processo di controllo del terminale e non fallirà né attenderà che altri processi rilascino il terminale. syslog collega l'output standard al logger di sistema syslog (3). kmsg lo collega al buffer del log del kernel, accessibile tramite dmesg (1). syslog + console e kmsg + consolefunziona in modo simile ma copia anche l'output sulla console di sistema. socket collega l'output standard a un socket dall'attivazione del socket, la semantica è simile alla rispettiva opzione diStandardInput=
. L'impostazione predefinita è eredita.
Questo significa che queste sono le mie uniche opzioni? Vorrei, ad esempio, inserire l'output /dev/shm
o qualcosa del genere. Suppongo che potrei usare un socket di dominio Unix e scrivere un semplice ascoltatore, ma questo sembra un po 'inutile.
Ho solo bisogno di questo per il debug e probabilmente finirò per rimuovere la maggior parte dei registri e cambiare l'output in syslog.
/var/log/syslog
, ma /var/log/messages
fa il trucco. Il problema è che, secondo i registri, il mio demone si arresta in modo anomalo all'avvio, ma posso dire che è ancora in esecuzione perché ha un server HTTP e posso interrogarlo. Sembra che il resto dei registri si stiano perdendo ...
StandardOutput=tty
modo da poter vedere cosa sta succedendo quando avvii il tuo demone. Dovrebbe essere emesso il terminale (potrebbe essere necessario utilizzare ttyS0
o simile per ottenere l'output sullo schermo).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
output? La maggior parte dei sistemi accederà alle cose,/var/log/
quindi inizierei controllando lì. Puoi usare lagrep
ricerca di testo se conosci l'output:grep "my output" /var/log
dovresti fare il trucco.