systemd il 15.04 non registra lo stdout dell'unità


12

Attualmente sto cercando di creare un'unità systemd come server Web. Attualmente, il mio foo.servicefile ha il seguente aspetto:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

L' fooeseguibile registra automaticamente tutte le richieste HTTP su stdout - questo è ben testato. Tuttavia, quando visualizzo i registri con journalctl -u foo, ottengo solo un output in questo modo:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

Qualcuno potrebbe spiegare perché non sta registrando tutto l'output stdout? Ho dato una breve occhiata a questa domanda precedente , ma non aiuta - tuttavia alludeva a qualcosa del tipo "... potrebbe non funzionare per i sistemi che non usano full systemd" - sarebbe questo il caso di Ubuntu 15.04 ? Grazie in anticipo, qualsiasi aiuto con questo sarebbe molto apprezzato!


1
Assicurarsi che il processo non esegua il buffering dell'output. Avevo un problema simile e si è risolto disabilitando il buffering dell'output del mio script Python. Poiché il numero di record di log prodotti non era elevato, sembrava che non ci fosse alcuna registrazione, ma in realtà non aveva ancora alcuna possibilità, poiché tutto si stava ancora raccogliendo nel buffer di output stdout.
Jan Vlcinsky,

1
Sto cercando di risolvere anche questo. Ho l'impressione che systemd esegua il buffering. stdout ha un buffer di linea in UNIX, ma systemd fa le sue cose e buffer molto di più (per essere veloce ma forse inutile).
Velkan,

Ho avuto lo stesso problema e il buffering con la funzione di stampa di Python era il problema! Da quando usavo Python 3 ho appena usato qualcosa di simile print('Hello World!', flush=True)e questo ha funzionato! L'output ha iniziato a essere visualizzato in journalctl.
timbram,

Risposte:


9

In effetti, il buffering in UNIX dipende dal contesto: quando stdout viene reindirizzato a qualcosa di interattivo come una console - di solito è bufferizzato in linea, altrimenti è completamente bufferizzato.

Il buffering può essere modificato all'interno dell'applicazione mediante la chiamata alla libreria setvbuf .

Ma può anche essere fatto con il comando stdbuf all'avvio:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(per caso con buffer di linea)


Questo mi ha salvato la giornata! Grazie mille. Ma sono un po 'confuso con ExecStart=/my/foo/program, perché il registro stdout non viene scaricato quando il servizio viene terminato, ma scompare completamente.
wlnirvana,

0

Per impostazione predefinita su Ubuntu 15.04 , systemd riviste sono solo volatili e tenute in /run/systemd/journale si perdono ad ogni riavvio. Per utilizzare il journal di systemd persistente , è necessario creare la directory (e riavviare systemd-journald.service)./var/log/journal

Quindi, potrebbe essere, l' stdoutoutput viene semplicemente reindirizzato sysloge non conservato nel journal di systemd . Per questo, potrebbe essere necessario utilizzare un persistente systemd rivista come spiegato sopra.

Hai controllato il /var/log/syslogtuo fooregistro?


L'ho creato /var/log/journalcome hai detto tu, ma non vedo comunque stdout del mio servizio systemd. nel /var/log/syslognon lo vedo nemmeno io.
disconnessione il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.