私は(自分で作成した)サービスを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.
これをスクリプト化する必要がある場合は、systemctl show
コマンドを使用して調べる必要があります。 status
から何かを解析しようとするよりも、スクリプトにとって便利です。たとえば、サービスが最後にいつ開始されたかを見つけるには、次のコマンドを使用できます。
$ systemctl show systemd-journald --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2017-11-08 05:55:17 UTC
利用可能なすべてのプロパティを表示したい場合は、フラグを省略すれば、すべてのプロパティがダンプされます。
$ systemctl show <service_name>
これらのプロパティのドキュメントは here にあります。
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.
サービスが最後に開始または再起動した時刻を確認できます。 _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
_
-f
ジャーナルからのメッセージをフィルターするオプション( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html )。
journalctl -f _TRANSPORT=journal example