Systemd hizmetinin stdout / stderr'sini görüntüleyin


175

Özel bir uygulama için basit bir systemd servis dosyası oluşturdum. Elle çalıştırdığımda uygulama iyi çalışıyor, ancak systemd ile çalıştırdığımda CPU'm maksimuma çıkıyor.

Sorunumun nerede olduğunu bulmaya çalışıyorum, ancak çıktıyı nerede bulacağımı bilmiyorum (ya da sistemi nasıl bir yere koyacak şekilde yapılandırabilirim).

İşte servis dosyam:

[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

Başvuru boyunca stdout ve stderr çıktı.

Daemon'un çıktısını nasıl okuyabilirim?

Düzenle:

Bulduğum man systemd.execsözü hangi StandardOutput=seçeneği, ancak bunu nasıl kullanılacağını emin değilim. Gönderen adam sayfası :

StandardOutput=

Yürütülen işlemlerin dosya tanımlayıcısı 1'in (STDOUT) nereye bağlı olduğunu kontrol eder. Birini alır inherit , boş , tty , syslog , kmsg , kmsg + konsolda , syslog + konsolun veya soket .

Olarak ayarlanırsa miras standart girdi dosya tanıtıcı standart çıkış için yineleniyor. Boş değere ayarlanırsa standart çıkış bağlanacaktır /dev/null, yani kendisine yazılan her şey kaybedilecektir. Tty'ye ayarlandıysa standart çıkış bir tty'ye bağlanacaktır (yapılandırıldığı gibi TTYPath=aşağıya bakınız). Eğer TTY çıkış için kullanılırsa sadece yürütülen işlem terminalin kontrol süreci haline gelmeyecek ve diğer işlemlerin terminali serbest bırakmasını beklemeyecektir. syslog standart çıktıyı syslog (3) sistem günlüğüne bağlar. kmsg , onu dmesg (1) aracılığıyla erişilebilen çekirdek günlük arabelleğine bağlar. syslog + konsolu ve kmsg + konsolubenzer şekilde çalışır, ancak çıktısını sistem konsoluna da kopyalar. soket standart çıktıyı soket etkinleştirme işleminden bir sokete bağlar, anlambilim ilgili seçeneklere benzer StandardInput=. Bu ayar varsayılan olarak devralınır.

Bu, benim tek seçenek olduğum anlamına mı geliyor? Örneğin, çıktının içine /dev/shmfalan koymak istiyorum . Sanırım bir Unix alan soketi kullanıp basit bir dinleyici yazabilirim, ama bu biraz gereksiz görünüyor.

Sadece hata ayıklama için buna ihtiyacım var ve muhtemelen günlüklerin çoğunu kaldırarak sonunu syslog olarak değiştireceğim.


/var/log/syslogÇıktı için kontrol denediniz mi? Çoğu sistem bir şeyler girecek ve /var/log/ben de orayı kontrol ederek başlayacağım. grepÇıktıyı biliyorsanız metin aramak için kullanabilirsiniz : grep "my output" /var/loghile yapmalısınız.
sbtkd85

@ sbtkd85 - Eh, ben yok /var/log/syslog, ama /var/log/messageshile yapar. Sorun şu ki günlüklere göre, arka planım başlangıçta çöküyor, ancak hala çalıştığını söyleyebilirim çünkü bir HTTP sunucusu var ve onu sorgulayabiliyorum. Görünüşe göre kayıtların geri kalanı kayboluyor ...
beatgammit

Neden ayar yapmayı denemiyorsunuz, StandardOutput=ttyböylece daemon'unuzu başlatırken ne olduğunu görebilirsiniz. Terminalin çıkışını yapmalıdır ( ttyS0ekranınızdaki çıkışı almak için kullanmanız gerekebilir veya benzer).
sbtkd85 12:11

3
Standart IO yönlendirme operatörleri bu bağlamda çalışmamalıdır. Gibi bir şeyExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal

İşlemcinizi gerçekten suistimal eden nedir? Sisteminiz mi, hizmetiniz mi yoksa sisteminiz mi (örneğin, sistem çılgına döndüğü için hizmetin yeni kopyalarını doğurarak)?
Peterph,

Yanıtlar:


183

Güncelleme

Mikemaccana'nın belirttiği gibi, sistem günlüğü artık çoğu dağıtım için standart kayıt cihazıdır. Bir sistem birimi stdoutve stderrbirisini görüntülemek için journalctlkomutu kullanın.

sudo journalctl -u [unit]

Orijinal cevap

Varsayılan olarak stdoutve stderrsistemd birimin syslog'a gönderilmesi.

Sistemin tamamını kullanıyorsanız, bu işlem yoluyla güvenilir olacaktır journalctl. Fedora'da öyle olmalı /var/log/messagesama syslog kurallarının söylediği yere koyacak.

Nedeniyle gönderinin tarihi ve fötr yoluyla, muhtemelen burada açıklanan böcek tarafından vuruldu edilir systemd maruz kalan çoğu insan varsayarak için: https://bugzilla.redhat.com/show_bug.cgi?id=754938 It has hepsinin de nasıl çalıştığının iyi bir açıklaması =) (Bu, selinux politikasında hata mesajlarının kaydedilmemesine neden olan bir hataydı ve düzeltildi selinux-policy-3.10.0-58.fc16)


5
Bu gibi standart günlük mekanizmasını kullanarak unutmayın değil varsayılan olarak kalıcı günlükleri oluşturun. Bunu yapmak için, / var / log / journal oluşturmanız ve ardından çalıştırmanız gerekirsudo systemctl restart systemd-journald
mlissner

1
Hangi syslog tesisi ve önceliği?
jrwren

2
Bu benim için çalıştı: StandardOutput=syslog+consoleve StandardError=syslog+consolebundan sonra benim birimimden tüm çıktılar journalctl'de göründü. Varsayılan ayar görünüşte yanlıştı. (
/Etc/systemd/system.conf

2
-fbenim için yardımcı oldu. Değişikliklerin gerçekleştiği günlüğü takip
ettim

2
Bu beni çıldırtıyor ... Standart bir Debian streç gazetesinde, herhangi bir standart çıktıyı bana göstermiyor. Hatta kullanıyorum /usr/bin/stdbuf -oL <cmd>ve açık bir şekilde StandardOutput=journal. Hala hiçbirşey.
JLH

81

Daha kısa, daha basit, eski olmayan cevap:

sudo journalctl -u [unitfile]

[Birim dosya] sistem .serviceadıdır. Örneğin, iletileri görmek için myapp.service,

sudo journalctl --unit=myapp

Günlükleri gerçek zamanlı olarak takip etmek için:

sudo journalctl -f -u myapp

4
sudoBir No journal files foundhata alırsanız yapmanız gerekebileceğini unutmayın .
bigjosh 17:15

5
syslog eski değil ...
Miles Rout

2
Şu anki Linux dağıtımlarında. Gerçekten syslog gibi olabilir ama bu onların neyle sevk ettiklerini değiştirmez.
mikemaccana

1
Elbette. Ayrıca syslog kullanır. Demek istediğim bu sistem kullanılmamış, ama bu sistem günlüğü değil.
labirent

6
@JECompton mevcut Linux dağıtımlarındaki tüm kayıtlar dergiyi kullanıyorsa ve syslog gerekli değilse ve sadece uyumluluk için kullanılıyorsa, o zaman mantıken syslog'un eski olduğunu izler.
mikemaccana
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.