it-swarm-id.com

Lihat stdout / stderr dari layanan systemd

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?

Edit:

Saya menemukan man systemd.exec, yang menyebutkan StandardOutput= pilihan, tapi 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 + konsol , syslog + konsol atau soket .

Jika diatur ke mewarisi file deskriptor dari input standar digandakan untuk output standar. Jika diatur ke null output standar akan terhubung ke /dev/null, mis. semua yang tertulis di dalamnya 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 + console bekerja dengan cara yang sama 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 keluaran /dev/shm atau 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 ke syslog.

196
beatgammit

Memperbarui

Seperti yang dicatat mikemaccana, jurnal systemd sekarang menjadi perangkat logging standar untuk sebagian besar distro. Untuk melihat stdout dan stderr unit systemd gunakan perintah journalctl).

Sudo journalctl -u [unit]

Jawaban Asli

Secara default stdout dan stderr dari unit systemd dikirim ke syslog.

Jika Anda menggunakan systemd penuh, ini akan dapat diakses melalui journalctl. Di Fedora, seharusnya /var/log/messages tetapi syslog akan meletakkannya di tempat yang menurut aturan 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 dalam kebijakan-selinux yang menyebabkan pesan kesalahan tidak dicatat, dan diperbaiki di selinux-policy-3.10.0-58.fc16)

201
Matt

Jawaban yang lebih pendek, sederhana, non-warisan:

Sudo journalctl -u [unitfile]

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

Sudo journalctl --unit=myapp

Untuk mengikuti log secara real time:

Sudo journalctl -f -u myapp
90
mikemaccana