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 melaluiTTYPath=
, 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 - masingStandardInput=
. Pengaturan ini default untuk diwarisi.
Apakah ini berarti bahwa ini adalah satu-satunya pilihan saya? Saya ingin, misalnya, untuk memasukkan output /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 menjadi syslog.
sumber
/var/log/syslog
output? Sebagian besar sistem akan mencatat barang/var/log/
jadi saya akan mulai dengan memeriksa di sana. Anda dapat menggunakangrep
untuk mencari teks jika Anda tahu hasilnya:grep "my output" /var/log
harus melakukan trik./var/log/syslog
, tetapi/var/log/messages
melakukan 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 ...StandardOutput=tty
agar Anda dapat melihat apa yang terjadi ketika Anda meluncurkan daemon Anda. Seharusnya output terminal (Anda mungkin harus menggunakanttyS0
atau serupa untuk mendapatkan output di layar Anda).ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Jawaban:
Memperbarui
Seperti dicatat mikemaccana, jurnal systemd sekarang menjadi perangkat logging standar untuk sebagian besar distro. Untuk melihat
stdout
danstderr
unit systemd gunakanjournalctl
perintah.Jawaban Asli
Secara default
stdout
danstderr
unit systemd dikirim ke syslog.Jika Anda menggunakan systemd penuh, ini akan dapat diakses melalui
journalctl
. Di Fedora, itu seharusnya/var/log/messages
tetapi 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
)sumber
sudo systemctl restart systemd-journald
StandardOutput=syslog+console
danStandardError=syslog+console
setelah itu semua output dari unit saya muncul di journalctl. Pengaturan default ternyata salah. (Seperti DefaultStandardOutput di /etc/systemd/system.conf)-f
sangat membantu bagi saya. Mengikuti log saat perubahan terjadi (use case mengikuti server minecraft yang berjalan sebagai daemon)/usr/bin/stdbuf -oL <cmd>
dan eksplisitStandardOutput=journal
. Tetap tidak ada.Jawaban yang lebih pendek, sederhana, non-warisan:
Di mana [unitfile] adalah
.service
nama systemd . Misalnya, untuk melihat pesan darimyapp.service
,Untuk mengikuti log secara real time:
sumber
sudo
jika mendapatNo journal files found
kesalahan.