15.04'teki systemd, ünitenin stdout'unu kaydetmez


12

Şu anda bir web sunucusu olarak bir systemd birimi yapmaya çalışıyorum. Şu anda, foo.servicedosyam aşağıdaki gibi görünüyor:

[Unit]
Description=The Foo Web Server

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

[Install]
WantedBy=multi-user.target

fooYürütülebilir otomatik stdout'a tüm HTTP isteklerini kaydeder - bu iyi test edilir. Ancak, günlükleri ile görüntülediğimde journalctl -u foo, ben sadece böyle çıktı alırsınız:

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

Birisi neden tüm stdout çıktılarını günlüğe kaydetmediğini açıklayabilir mi? Bu önceki soruya kısaca baktım , ancak yardımcı olmaz - ancak "... tam systemd kullanmayan sistemler için çalışmayabilir" çizgisi boyunca bir şeye işaret etti - bu Ubuntu 15.04 için geçerli olurdu ? Şimdiden teşekkür ederim, bu konuda herhangi bir yardım çok takdir edilecektir!


1
İşleminizin çıktıyı arabelleğe almadığından emin olun. Benzer bir sorun yaşıyordum ve benim python betiğimin çıktı arabelleğini devre dışı bırakarak çözüldü. Üretilen günlük kayıtlarının sayısı fazla olmadığından, günlük kaydı yok gibi görünüyordu, ama aslında, hala stdout çıktı tamponunda toplandığı için henüz şansı yoktu.
Jan Vlcinsky

1
Bunu da düzeltmeye çalışıyorum. Systemd'in arabelleğe aldığı konusunda bir izlenimim var. stdout, UNIX'te satır arabelleğe alınır, ancak systemd kendi işini yapar ve çok daha fazla arabelleğe alır (hızlı ancak işe yaramaz olmak için).
Velkan

Aynı sorunu vardı ve Python'ın yazdırma fonksiyonu ile arabelleğe alma sorunu oldu! Python 3'ü kullandığım için sadece böyle bir şey kullandım print('Hello World!', flush=True)ve bu hile yaptı! Çıktılar journalctl'de görünmeye başladı.
timbram

Yanıtlar:


9

Aslında, UNIX'te arabelleğe alma içeriğe bağlıdır: stdout bir konsol gibi etkileşimli bir şeye yönlendirildiğinde - genellikle satır arabelleğe alınır, aksi takdirde tamamen arabelleğe alınır.

Arabelleğe alma, uygulama içinde setvbuf kütüphane çağrısı kullanılarak değiştirilebilir .

Ancak lansman sırasında stdbuf komutu ile de yapılabilir :

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

(hat tamponlu çanta için)


Bu benim günümü kurtardı! Çok teşekkür ederim. Ancak ExecStart=/my/foo/program, hizmet sona erdirildiğinde stdout günlüğünün neden temizlenmediği, bunun yerine tamamen kaybolduğu konusunda biraz kafam karıştı .
wlnirvana

0

Ubuntu 15.04'te varsayılan olarak , systemd günlükleri yalnızca değişkendir ve /run/systemd/journalher yeniden başlatma sırasında içeride tutulur ve kaybolur. Kalıcı systemd günlüğünü kullanmak için, /var/log/journaldizini oluşturmanız (ve systemd-journalald.service'i yeniden başlatmanız) gerekir.

Yani, stdoutçıktı sadece sistemd günlüğüne yönlendirilir syslogve tutulmaz . Bunun için, yukarıda açıklandığı gibi kalıcı bir systemd günlüğü kullanmanız gerekebilir .

Eğer kontrol ettirin /var/log/syslogsizin için foolog?


/var/log/journalBahsettiğiniz gibi yarattım , ama yine de sistemd hizmetimin stdout görmüyorum. içinde /var/log/syslogben de görüyorum.
logoff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.