Làm cách nào để biết khi nào dịch vụ systemd được khởi động / dừng / khởi động lại?


12

Tôi có một dịch vụ (do chính tôi viết) đang chạy trên máy chủ Debian (Jessie) và nhật ký riêng của dịch vụ xảy ra để cho biết rằng nó đã khởi động lại vào một thời điểm cụ thể. Không có dấu hiệu của segfault hoặc sự cố khác, vì vậy bây giờ tôi đang cố gắng tìm hiểu xem ứng dụng bằng cách nào đó có âm thầm thất bại và được systemd xử lý hay liệu người dùng có cố tình khởi động lại dịch vụ thông qua hay không systemctl.

Lịch sử shell không hiển thị hoạt động như vậy, nhưng đó không phải là kết luận vì export HISTCONTROL=ignorebothvà vì một phiên SSH có thể đã hết thời gian, ngăn lịch sử bash của lần đăng nhập trước đó được ghi vào đĩa. Máy chủ không được khởi động lại vào thời điểm đó.

Nhưng tôi hy vọng rằng chính systemd sẽ giữ một bản ghi cho biết khi nào một dịch vụ được khởi động lại có chủ đích . Thật ngạc nhiên, tôi không thể tìm thấy bất kỳ tài liệu nào (ví dụ journalctl) về cách lấy các bản ghi đó.

Một số bài đăng khác (ví dụ: Where is / why không có nhật ký cho các dịch vụ systemd người dùng thông thường? ) Dường như chỉ ra rằng nên có các thông điệp tường trình như thế này:

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.

Nhưng tôi không thấy các thông điệp tường trình như vậy trên hệ thống của mình.

Có cách nào để tìm hiểu khi nào dịch vụ systemd được khởi động, dừng hoặc khởi động lại không?

Chỉnh sửa : Có vẻ như vấn đề điển hình mà mọi người có thể gặp phải là họ chạy journalctlnhư một người dùng không có đặc quyền. Đây không phải là trường hợp của tôi, tôi đã hoạt động như roottoàn bộ thời gian. Đáp lại một bình luận, việc chạy chỉ grep systemd /var/log/syslogmang lại cho tôi điều này:

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.

"Không thấy thông điệp tường trình như vậy" - lạ? Tôi có rất nhiều tronggrep systemd /var/log/syslog
hschou

Trên hệ thống của tôi, tôi chỉ thấy các thông báo rất chung chung Stopped target Default, Starting Shutdownv.v. Không có gì chỉ ra bất cứ điều gì về các dịch vụ riêng lẻ. Có lẽ đó chỉ là một vấn đề cấu hình? Lưu ý Tôi đang sử dụng Debian Jessie trong trường hợp cụ thể này.
mindriot

Kiểm tra /etc/systemd/journald.confkhông bị ghi đè MaxLevelStorehoặc MaxLevelSyslog, và tìm trong tất cả các địa điểm khác mà bạn có thể định cấu hình tạp chí như được liệt kê trong man journald.conf.
meuh

Cảm ơn vì tiền hỗ trợ. Thật không may, tất cả các tệp cấu hình nằm unter /etc/systemdvề cơ bản là trống (tất cả các tùy chọn nhận xét, bao gồm cả các tệp bạn đã đề cập).
mindriot

Câu trả lời:


11

Nếu bạn cần kịch bản này, bạn nên xem xét bằng cách sử dụng systemctl show lệnh. Nó hữu ích hơn cho các kịch bản hơn là cố gắng phân tích bất cứ thứ gì từ đó status. Ví dụ: để tìm khi dịch vụ bắt đầu lần cuối, bạn có thể sử dụng:

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

Nếu bạn muốn xem tất cả các thuộc tính có sẵn, chỉ cần bỏ qua cờ và nó sẽ loại bỏ tất cả chúng.

$ systemctl show <service_name>

Các tài liệu cho các tài sản này có thể được tìm thấy ở đây .


Thú vị, tôi đã không nhận thức được các tài sản. Thật không may, chúng được đặt giống nhau, bất kể dịch vụ có bị lỗi và bị lỗi hay không, hoặc dịch vụ được người dùng cố tình khởi động lại.
mindriot

1
Nhân tiện, một liên kết tốt hơn cho các thuộc tính dường như là tài liệu dbus .
mindriot

Cảm ơn @mindriot là một liên kết tốt hơn cho các tài liệu, tôi đã cập nhật câu trả lời của mình.
jdf

1
@mindriot về điểm đầu tiên của bạn, mặc dù bạn đã kiểm tra StatusErrnoResult? Tôi sẽ tự hỏi nếu những thay đổi nếu dịch vụ thất bại hoặc được khởi động lại. Nếu bạn thực sự cần phải đi xa hơn, hãy thử thêm một ExecStopPostbước mà bạn chạm vào một tệp và cập nhật dấu thời gian khi tắt máy. Điều đó sẽ giúp bạn phân biệt giữa khởi động lại im lặng và những người có mục đích.
jdf

Cảm ơn, đó cũng là một điểm tốt. Tôi sẽ không thể kiểm tra / tái tạo tình huống một cách dễ dàng; bài viết gốc của tôi đã gần nửa năm rồi và chúng tôi đã có một vài thay đổi đối với hệ thống. Tôi sẽ kiểm tra xem tôi có thể dùng thử ở đâu đó không - nếu tôi có cơ hội.
mindriot

3

Với cấu hình mặc định trên Debian, một người dùng không có đặc quyền sẽ có quyền truy cập vào nhật ký systemd-journald, cũng không phải nhật ký hệ thống. Nếu đăng nhập như một người dùng bình thường, bạn sẽ nhận được phản hồi này từ tạp chí:

$ journalctl 
No journal files were found.

đó là một chút khó hiểu.

Nếu bạn đã đăng nhập với quyền root, journalctl --unit=yourservicesẽ cung cấp cho bạn thông tin bạn đang tìm kiếm. Sau khi systemctl restart bind9trên máy chủ của tôi, tôi nhận được điều này sau 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.

Nếu tôi giết bind9 một cách rõ ràng với kill -9, journalctl --unit=bind9cho:

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.

Dòng đầu tiên chỉ ra rằng quá trình đã chết vì nó đã bị giết.

systemd-journald cũng chuyển tiếp tất cả các thông điệp tường trình tới syslog, vì vậy bạn cũng nên tìm thấy những thông báo này /var/log/syslog.

Systemd và systemd-journald có một cấu hình mặc định được biên dịch có thể được thay đổi trong /etc/systemd/system.conf/etc/systemd/journald.conf.

Nó có thể hữu ích để biết rằng mỗi mặc định, các bản ghi systemd-journald cửa hàng dưới /run, đó là tmpfs, và do đó sẽ biến mất sau khi khởi động lại. Điều này có nghĩa là để có được thông điệp tường trình cũ hơn lần khởi động trước, bạn sẽ phải xem các tệp nhật ký hệ thống. Trong trường hợp này, tạp chí sẽ không cung cấp cho bạn nhật ký cũ hơn lần khởi động trước. Điều này có thể được thay đổi /etc/systemd/journald.confbằng cách cài đặt Storage=persistent.

Các trang hướng dẫn tài liệu này là:

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

Cũng lưu ý rằng để dịch vụ được khởi động lại tự động bởi systemd, điều này phải được cấu hình trong .servicetệp của nó . Từ 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.

Cảm ơn bạn cho bài viết rộng rãi và được viết tốt mà có lẽ giải quyết vấn đề cho hầu hết người dùng. Thật không may, trong trường hợp của tôi, tôi không thấy bất kỳ dòng nhật ký nào được quy cho systemdkhi xuất ra tạp chí như bạn mô tả, mặc dù tôi đã làm việc tận gốc trong toàn bộ thời gian. /var/log/syslogcũng không hiển thị gì cả. Đây là systemd 215 bằng cách này.
mindriot

3

Bạn có thể thấy lần cuối cùng dịch vụ của bạn bắt đầu hoặc khởi động lại. Sử dụng service chatty statushoặc systemctl status chatty. Dưới đây là ví dụ cho dịch vụ apache2 hoặc 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

dòng Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min agohiển thị kể từ khi dịch vụ hoạt động nhưng tôi không biết liệu bạn có thể hiển thị như một "danh sách" chính xác những gì bạn đang tìm kiếm hay không.

# 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

1
servicelà một lệnh Upstart cũ hoạt động với systemd cho tính tương thích. Lệnh gốc systemdsystemctl status apache2.
Mark Stosberg

Cảm ơn. Thật không may, nó chỉ hiển thị khi dịch vụ được bắt đầu lại, nhưng không hiểu tại sao ; và nó cũng chỉ hiển thị tình hình hiện tại , tức là lần khởi động lại cuối cùng.
mindriot

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.