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.
/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 menggunakan ttyS0
atau serupa untuk mendapatkan output di layar Anda).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/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.