Bagaimana saya melihat ketika layanan systemd dimulai / dihentikan / restart?

12

Saya memiliki layanan (yang ditulis oleh saya sendiri) yang berjalan di server Debian (Jessie), dan log layanan itu sendiri menunjukkan bahwa ia memulai kembali pada waktu tertentu. Tidak ada indikasi segfault atau crash lainnya, jadi saya sekarang mencoba mencari tahu apakah aplikasi tersebut gagal dan diam-diam direspon oleh systemd, atau apakah pengguna dengan sengaja memulai kembali layanan melalui systemctl.

Sejarah shell tidak menunjukkan aktivitas seperti itu, tetapi itu tidak konklusif karena export HISTCONTROL=ignorebothdan karena sesi SSH mungkin baru saja kehabisan waktu, mencegah riwayat bash login sebelumnya tidak ditulis ke disk. Server tidak di-reboot pada saat itu.

Tetapi saya berharap bahwa systemd itu sendiri harus menyimpan log yang menunjukkan kapan suatu layanan sengaja dimulai kembali. Yang mengejutkan saya, saya tidak dapat menemukan dokumentasi (misalnya untuk journalctl) tentang cara mendapatkan log tersebut.

Beberapa posting lain (mis. Di mana / mengapa tidak ada log untuk layanan systemd pengguna normal? ) Tampaknya menunjukkan bahwa harus ada pesan log seperti ini:

Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.

Tapi saya tidak melihat pesan log seperti itu di sistem saya.

Apakah ada cara untuk mengetahui kapan layanan systemd dimulai, dihentikan atau dimulai kembali?

Sunting : Tampaknya masalah khas yang mungkin dialami orang adalah bahwa mereka dijalankan journalctlsebagai pengguna yang tidak memiliki hak istimewa. Ini tidak terjadi pada saya, saya telah beroperasi rootsepanjang waktu. Menanggapi komentar, menjalankan grep systemd /var/log/sysloghanya memberi saya ini:

Jun  6 09:28:35 server systemd[22057]: Starting Paths.
Jun  6 09:28:35 server systemd[22057]: Reached target Paths.
Jun  6 09:28:35 server systemd[22057]: Starting Timers.
Jun  6 09:28:35 server systemd[22057]: Reached target Timers.
Jun  6 09:28:35 server systemd[22057]: Starting Sockets.
Jun  6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun  6 09:28:35 server systemd[22057]: Starting Basic System.
Jun  6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun  6 09:28:35 server systemd[22057]: Starting Default.
Jun  6 09:28:35 server systemd[22057]: Reached target Default.
Jun  6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun  6 09:37:08 server systemd[1]: Reexecuting.
mindriot
sumber
"tidak melihat pesan log seperti itu" - aneh? Saya punya banyak digrep systemd /var/log/syslog
hschou
Di sistem saya, saya hanya melihat pesan yang sangat umum seperti Stopped target Default, Starting Shutdowndll. Tidak ada yang menunjukkan apa pun tentang layanan individual. Mungkin itu hanya masalah konfigurasi? Catatan saya di Debian Jessie dalam kasus khusus ini.
mindriot
Periksa /etc/systemd/journald.confapakah Anda belum mengganti MaxLevelStoreatau MaxLevelSyslog, dan lihat di semua tempat lain yang dapat Anda konfigurasikan journald sebagaimana tercantum dalam man journald.conf.
meuh
Terima kasih atas tipnya. Sayangnya, semua file konfigurasi yang terletak /etc/systemdpada dasarnya kosong (semua opsi dikomentari, termasuk yang Anda sebutkan).
mindriot

Jawaban:

11

Jika Anda perlu skrip ini, Anda harus melihat ke dalam menggunakan systemctl show perintah. Ini lebih berguna untuk skrip daripada mencoba mem-parsing apa pun dari status. Misalnya, untuk mengetahui kapan layanan terakhir dimulai, Anda dapat menggunakan:

$ systemctl show systemd-journald --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2017-11-08 05:55:17 UTC

Jika Anda ingin melihat semua properti yang tersedia cukup abaikan bendera dan semuanya akan dibuang.

$ systemctl show <service_name>

Dokumentasi untuk properti ini dapat ditemukan di sini .

jdf
sumber
Menarik, saya tidak mengetahui propertinya. Sayangnya, mereka disetel sama, terlepas dari apakah layanan gagal dan respawned, atau layanan itu sengaja dimulai kembali oleh pengguna.
mindriot
1
Omong-omong, tautan yang lebih baik untuk properti tampaknya adalah dokumentasi dbus .
mindriot
Terima kasih @mindriot yang merupakan tautan yang lebih baik untuk dokumen, saya telah memperbarui jawaban saya.
jdf
1
@mindriot tentang poin pertama Anda, sudahkah Anda memeriksa StatusErrnodan Result? Saya akan bertanya-tanya apakah itu berubah jika layanan gagal atau dimulai kembali. Jika Anda benar-benar perlu melangkah lebih jauh, cobalah menambahkan ExecStopPostlangkah di mana Anda menyentuh file dan memperbarui cap waktu saat shutdown. Itu akan membantu Anda membedakan antara restart diam dan yang bertujuan.
jdf
Terima kasih, itu juga poin yang bagus. Saya tidak akan dapat memeriksa / mereproduksi situasi dengan mudah; posting asli saya sudah hampir setengah tahun dan kami telah memiliki beberapa perubahan pada sistem. Saya akan memeriksa apakah saya bisa mencobanya di suatu tempat - jika saya mendapat kesempatan.
mindriot
3

Dengan konfigurasi default pada Debian, pengguna yang tidak berhak tidak akan memiliki akses ke systemd-journald, atau log syslog. Jika masuk sebagai pengguna normal, Anda akan menerima respons ini dari journalctl:

$ journalctl 
No journal files were found.

yang agak membingungkan.

Jika Anda login sebagai root, journalctl --unit=yourserviceharus memberi Anda informasi yang Anda cari. Setelah systemctl restart bind9di server saya, saya mendapatkan ini setelah journalctl --unit=bind9:

Jun 03 18:20:24 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:20:24 ns named[27605]: received control channel command 'stop'
Jun 03 18:20:24 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:20:24 ns systemd[1]: Started BIND Domain Name Server.

Jika saya membunuh bind9 secara eksplisit dengan kill -9, journalctl --unit=bind9berikan:

Jun 03 18:46:25 ns systemd[1]: bind9.service: main process exited, code=killed, status=9/KILL
Jun 03 18:46:25 ns rndc[28028]: rndc: connect failed: 127.0.0.1#953: connection refused
Jun 03 18:46:25 ns systemd[1]: bind9.service: control process exited, code=exited status=1
Jun 03 18:46:25 ns systemd[1]: Unit bind9.service entered failed state.
Jun 03 18:46:25 ns systemd[1]: bind9.service holdoff time over, scheduling restart.
Jun 03 18:46:25 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Started BIND Domain Name Server.

Baris pertama menunjukkan bahwa proses mati karena terbunuh.

systemd-journald juga meneruskan semua pesan log ke syslog, jadi Anda juga harus menemukan pesan-pesan ini di /var/log/syslog.

Systemd dan systemd-journald memiliki default yang dikompilasi dalam konfigurasi yang dapat diubah di /etc/systemd/system.confdan /etc/systemd/journald.conf.

Ini mungkin berguna untuk mengetahui bahwa per default, systemd-journald toko log di bawah /run, yang tmpfs, dan karena itu menghilang setelah reboot. Ini berarti bahwa untuk mendapatkan pesan log yang lebih lama dari boot terakhir, Anda harus melihat file syslog. Dalam hal ini, journalctl tidak akan memberi Anda log yang lebih lama dari boot terakhir. Ini dapat diubah /etc/systemd/journald.confdengan pengaturan Storage=persistent.

Halaman manual yang mendokumentasikan ini adalah:

man 8 systemd-journald
man 5 journald.conf
man 5 systemd-system.conf
man 5 systemd-user.conf

Juga perhatikan bahwa agar layanan dapat dimulai ulang secara otomatis oleh systemd, ini harus dikonfigurasi dalam .servicefile itu. Dari man 5 systemd.service:

   Restart=
       Configures whether the service shall be
       restarted when the service process exits, is
       killed, or a timeout is reached. The service
       process may be the main service process, but it
       may also be one of the processes specified with
       ExecStartPre=, ExecStartPost=, ExecStop=,
       ExecStopPost=, or ExecReload=. When the death
       of the process is a result of systemd operation
       (e.g. service stop or restart), the service
       will not be restarted. Timeouts include missing
       the watchdog "keep-alive ping" deadline and a
       service start, reload, and stop operation
       timeouts.

       Takes one of no, on-success, on-failure,
       on-abnormal, on-watchdog, on-abort, or always.
       If set to no (the default), the service will
       not be restarted.
Tom Bjerck
sumber
Terima kasih atas kiriman yang luas dan ditulis dengan baik yang mungkin memecahkan masalah bagi sebagian besar pengguna. Sayangnya, dalam kasus saya, saya tidak melihat adanya garis log yang dikaitkan dengan systemdsaat mengeluarkan jurnal seperti yang Anda gambarkan, meskipun saya telah bekerja sebagai root sepanjang waktu. /var/log/syslogjuga tidak menunjukkan apa-apa. Omong-omong, ini systemd 215.
mindriot
3

Anda dapat melihat kapan layanan Anda terakhir kali dimulai atau dimulai kembali. Gunakan service chatty statusatau systemctl status chatty. Berikut adalah contoh untuk layanan apache2 atau httpd:

# service apache2 status
● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
  Drop-In: /lib/systemd/system/apache2.service.d
       └─forking.conf
   Active: active (running) since ven. 2017-06-02 15:53:01 CEST; 21min ago
  Process: 14773 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 22912 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
  Process: 14880 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service

baris Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min agomenunjukkan sejak bagaimana layanan ini berjalan tetapi saya tidak tahu apakah Anda dapat menampilkan seperti 'daftar' persis apa yang Anda cari.

# systemctl status httpd

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-10-11 00:35:58 EEST; 1 weeks 3 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 29728 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 10722 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   Memory: 8.7M
klaypez
sumber
1
serviceadalah perintah pemula baru yang bekerja dengan systemd untuk kompatibilitas. systemdPerintah asli adalah systemctl status apache2.
Mark Stosberg
Terima kasih. Sayangnya itu hanya menunjukkan kapan layanan itu (kembali) dimulai, tetapi tidak mengapa ; dan itu juga hanya menunjukkan situasi saat ini, yaitu, restart terakhir.
mindriot