Lihat stdout / stderr dari layanan systemd

175

Saya telah membuat file layanan systemd sederhana untuk aplikasi khusus. Aplikasi ini berfungsi dengan baik ketika saya menjalankannya secara manual, tetapi CPU saya menjadi maksimal ketika saya menjalankannya dengan systemd.

Saya mencoba melacak di mana masalah saya, tapi saya tidak tahu di mana menemukan output (atau bagaimana mengkonfigurasi systemd untuk meletakkan output di suatu tempat).

Ini file layanan saya:

[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

Sepanjang aplikasi, saya output ke stdout dan stderr.

Bagaimana saya bisa membaca output daemon saya?

Sunting:

Saya menemukan man systemd.exec, yang menyebutkan StandardOutput=opsi, tetapi saya tidak yakin bagaimana menggunakannya. Dari halaman manual :

StandardOutput=

Kontrol di mana file deskriptor 1 (STDOUT) dari proses yang dijalankan terhubung ke. Mengambil salah satu dari inherit , null , tty , syslog , kmsg , kmsg + console , syslog + console atau socket .

Jika diatur untuk mewarisi deskriptor file dari input standar digandakan untuk output standar. Jika diatur ke null, output standar akan terhubung /dev/null, yaitu semua yang ditulis untuk itu akan hilang. Jika diatur ke tty, output standar akan terhubung ke tty (sebagaimana dikonfigurasi melalui TTYPath=, lihat di bawah). Jika TTY digunakan untuk output hanya proses yang dieksekusi tidak akan menjadi proses pengendalian terminal, dan tidak akan gagal atau menunggu proses lain untuk melepaskan terminal. syslog menghubungkan output standar ke logger sistem syslog (3). kmsg menghubungkannya dengan buffer log kernel yang dapat diakses melalui dmesg (1). syslog + console dan kmsg + consolebekerja serupa tetapi salin output ke konsol sistem juga. soket menghubungkan keluaran standar ke soket dari aktivasi soket, semantik mirip dengan opsi masing - masing StandardInput=. Pengaturan ini default untuk diwarisi.

Apakah ini berarti bahwa ini adalah satu-satunya pilihan saya? Saya ingin, misalnya, untuk memasukkan output /dev/shmatau sesuatu. Saya kira saya bisa menggunakan soket domain Unix dan menulis pendengar sederhana, tetapi ini sepertinya tidak perlu.

Saya hanya perlu ini untuk debugging, dan saya mungkin akhirnya akan menghapus sebagian besar log dan mengubah output menjadi syslog.

hajar
sumber
Sudahkah Anda mencoba memeriksa /var/log/syslogoutput? Sebagian besar sistem akan mencatat barang /var/log/jadi saya akan mulai dengan memeriksa di sana. Anda dapat menggunakan grepuntuk mencari teks jika Anda tahu hasilnya: grep "my output" /var/logharus melakukan trik.
sbtkd85
@ sbtkd85 - Yah, saya tidak punya /var/log/syslog, tetapi /var/log/messagesmelakukan trik. Masalahnya adalah, menurut log, daemon saya crash pada saat start, namun saya dapat mengatakan bahwa itu masih berjalan karena memiliki server HTTP, dan saya dapat menanyakannya. Tampaknya sisa log hilang ...
beatgammit
Mengapa tidak mencoba pengaturan StandardOutput=ttyagar Anda dapat melihat apa yang terjadi ketika Anda meluncurkan daemon Anda. Seharusnya output terminal (Anda mungkin harus menggunakan ttyS0atau serupa untuk mendapatkan output di layar Anda).
sbtkd85
3
Seharusnya operator pengalihan IO standar tidak bekerja dalam konteks ini. Sesuatu sepertiExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal
Apa yang sebenarnya menyalahgunakan CPU Anda? Apakah itu systemd, layanan Anda atau sistem (misalnya dengan menelurkan salinan baru dari layanan karena systemd menjadi gila)?
peterph

Jawaban:

184

Memperbarui

Seperti dicatat mikemaccana, jurnal systemd sekarang menjadi perangkat logging standar untuk sebagian besar distro. Untuk melihat stdoutdan stderrunit systemd gunakan journalctlperintah.

sudo journalctl -u [unit]

Jawaban Asli

Secara default stdoutdan stderrunit systemd dikirim ke syslog.

Jika Anda menggunakan systemd penuh, ini akan dapat diakses melalui journalctl. Di Fedora, itu seharusnya /var/log/messagestetapi syslog akan meletakkannya di tempat yang menurut peraturan Anda.

Karena tanggal posting, dan dengan asumsi kebanyakan orang yang terkena systemd adalah melalui fedora, Anda mungkin terkena bug yang dijelaskan di sini: https://bugzilla.redhat.com/show_bug.cgi?id=754938 Ia memiliki penjelasan yang baik tentang bagaimana semuanya bekerja juga =) (Ini adalah bug di selinux-policy yang menyebabkan pesan kesalahan tidak dicatat, dan diperbaiki selinux-policy-3.10.0-58.fc16)

Mat
sumber
5
Perhatikan bahwa menggunakan mekanisme pencatatan standar seperti ini tidak akan membuat log persisten secara default. Untuk melakukan itu, Anda harus membuat / var / log / jurnal, dan kemudian jalankansudo systemctl restart systemd-journald
mlissner
1
fasilitas dan prioritas syslog apa?
jrwren
2
Ini bekerja untuk saya: StandardOutput=syslog+consoledan StandardError=syslog+consolesetelah itu semua output dari unit saya muncul di journalctl. Pengaturan default ternyata salah. (Seperti DefaultStandardOutput di /etc/systemd/system.conf)
gregn3
2
-fsangat membantu bagi saya. Mengikuti log saat perubahan terjadi (use case mengikuti server minecraft yang berjalan sebagai daemon)
blaughw
2
Ini membuat saya gila ... Pada rentang standar Debian journalctl tidak akan menunjukkan kepada saya output standar apa pun. Saya bahkan menggunakan /usr/bin/stdbuf -oL <cmd>dan eksplisit StandardOutput=journal. Tetap tidak ada.
jlh
81

Jawaban yang lebih pendek, sederhana, non-warisan:

sudo journalctl -u [unitfile]

Di mana [unitfile] adalah .servicenama systemd . Misalnya, untuk melihat pesan dari myapp.service,

sudo journalctl --unit=myapp

Untuk mengikuti log secara real time:

sudo journalctl -f -u myapp
mikemaccana
sumber
4
Perhatikan bahwa Anda mungkin harus melakukannya sudojika mendapat No journal files foundkesalahan.
bigjosh
5
syslog bukan warisan ...
Miles Rout
2
Itu ada di distro Linux saat ini. Anda mungkin benar-benar menyukai syslog tetapi itu tidak mengubah apa yang mereka kirimkan.
mikemaccana
1
Tentu. Dan itu juga menggunakan syslog. Maksud saya bukanlah systemd tidak digunakan, tetapi syslog itu bukan warisan.
labirin
6
@JECompton jika semua logging di distro Linux saat ini menggunakan journald, dan syslog tidak diperlukan dan hanya digunakan untuk kompatibilitas, maka secara logis berikut bahwa syslog adalah warisan.
mikemaccana