web-dev-qa-db-ja.com

systemdサービスがいつ開始/停止/再開されたかを確認するにはどうすればよいですか?

私は(自分で作成した)サービスをDebian(Jessie)サーバーで実行していて、そのサービス自体のログは、特定の時間に再起動したことを示しています。 segfaultやその他のクラッシュの兆候はないので、アプリケーションがsilentlyに失敗してsystemdによって再起動されたかどうか、またはユーザーが意図的に再起動したかどうかを調べようとしていますsystemctl経由のサービス。

シェルの履歴にはそのようなアクティビティは表示されませんが、export HISTCONTROL=ignorebothのため、およびSSHセッションがタイムアウトしたため、以前のログインのbash履歴がディスクに書き込まれなかった可能性があるため、これは決定的なものではありません。現時点ではサーバーは再起動されていません。

しかし、私はsystemd自体がサービスが意図的に再起動されたことを示すログを保持する必要があると思います。驚いたことに、そのようなログを取得する方法に関するドキュメント(例:journalctl)を見つけることができませんでした。

他のいくつかの投稿(例: どこにあるのか/なぜ通常のユーザーのsystemdサービスのログがないのですか? )は、次のようなログメッセージがあるはずであることを示しているようです:

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.

しかし、システムにそのようなログメッセージは表示されません。

systemdサービスがいつ開始、停止、または再起動されたかを確認する方法はありますか?

編集:人々が遭遇する典型的な問題は、非特権ユーザーとしてjournalctlを実行することです。これは私には当てはまりません。私はずっとrootとして運営してきました。コメントに応じて、grep systemd /var/log/syslogを実行すると、これだけが得られます。

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.
12
mindriot

これをスクリプト化する必要がある場合は、systemctl showコマンドを使用して調べる必要があります。 statusから何かを解析しようとするよりも、スクリプトにとって便利です。たとえば、サービスが最後にいつ開始されたかを見つけるには、次のコマンドを使用できます。

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

利用可能なすべてのプロパティを表示したい場合は、フラグを省略すれば、すべてのプロパティがダンプされます。

$ systemctl show <service_name>

これらのプロパティのドキュメントは here にあります。

11
jdf

Debianのデフォルト設定では、非特権ユーザーはsystemd-journaldにもsyslogログにもアクセスできません。通常のユーザーとしてログインしている場合、journalctlから次の応答を受け取ります。

$ journalctl 
No journal files were found.

これは少し混乱します。

Rootとしてログインしている場合、journalctl --unit=yourserviceは探している情報を提供します。サーバーのsystemctl restart bind9の後、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.

Bind9をkill -9で明示的に強制終了すると、journalctl --unit=bind9は次のようになります。

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.

最初の行は、プロセスが強制終了されたためにプロセスが停止したことを示しています。

systemd-journaldはすべてのログメッセージをsyslogに転送するため、これらのメッセージは/var/log/syslogにもあります。

Systemdおよびsystemd-journaldには、/etc/systemd/system.confおよび/etc/systemd/journald.confで変更できるデフォルトのコンパイル済み構成があります。

Systemd-journaldはデフォルトで/runの下にログを保存するため、tmpfsであるため、再起動するとログが消えることを知っておくと便利です。つまり、前回の起動より古いログメッセージを取得するには、syslogファイルを確認する必要があります。この場合、journalctlは最後のブートより古いログを提供しません。これは、/etc/systemd/journald.confを設定することにより、Storage=persistentで変更できます。

これを説明するマニュアルページは次のとおりです。

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

また、systemdによってサービスが自動的に再起動されるようにするには、これを.serviceファイルで構成する必要があります。 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.
3
Tom Bjerck

サービスが最後に開始または再起動した時刻を確認できます。 _service chatty status_または_systemctl status chatty_を使用します。 Apache2または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
_

Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min agoという行はサービスがどのように実行されているかを示していますが、探しているものを「リスト」のように正確に表示できるかどうかはわかりません。

_# 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
_
3
klaypez

-fジャーナルからのメッセージをフィルターするオプション( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html )。

journalctl -f _TRANSPORT=journal example
0