我如何查看何时启动/停止/重新启动systemd服务?


12

我有一个在Debian(Jessie)服务器上运行的服务(由我自己编写),该服务自己的日志恰好表明它在特定时间重新启动。没有迹象表明存在段错误或其他崩溃,因此我现在试图确定应用程序是否以某种方式静默失败并被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.

“看不到这样的日志消息”-奇怪吗?我有很多东西grep systemd /var/log/syslog
hschou

在我的系统上,我只看到非常普通的消息,例如Stopped target DefaultStarting Shutdown等。什么都没有表示有关单个服务的任何信息。也许仅仅是配置问题?注意在这种情况下,我使用的是Debian Jessie。
mindriot

检查您/etc/systemd/journald.conf尚未被覆盖的MaxLevelStoreMaxLevelSyslog,并查看您可以配置的其他所有日志位置,如中所列man journald.conf
meuh

谢谢你的提示。不幸的是,位于unter的所有配置文件/etc/systemd实际上都是空的(注释掉了所有选项,包括您提到的选项)。
mindriot

Answers:


11

如果需要编写脚本,则应使用systemctl show 命令进行调查。对于脚本而言,它比尝试从中解析任何内容都更加有用status。例如,要查找服务的上次启动时间,可以使用:

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

如果您想查看所有可用的属性,只需省略该标志,它将所有这些属性转储出去。

$ systemctl show <service_name>

这些属性的文档可以在这里找到。


有趣的是,我不知道这些属性。不幸的是,无论服务是失败并重新生成,还是用户有意重新启动了服务,它们的设置都相同。
mindriot

1
顺便说一下,这些属性的更好链接似乎是dbus文档
mindriot

感谢@mindriot,它是文档的更好链接,我已经更新了答案。
jdf

1
@mindriot关于你的第一个问题,虽然,你检查StatusErrnoResult?我想知道这些更改是否是服务失败或重新启动。如果您确实需要进一步尝试,请尝试添加一个ExecStopPost步骤,在其中触摸文件并在关机时更新时间戳。这将帮助您区分静默重启和有目的重启。
jdf

谢谢,这也是一个好点。我将无法轻松检查/重现这种情况;我的原始帖子已经快半年了,从那时起我们对系统进行了一些更改。我会检查是否可以在某个地方尝试-如果有机会的话。
mindriot

3

在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.

感谢您撰写的内容广泛且写得很好的文章,对于大多数用户而言,它可能可以解决该问题。不幸的是,就我而言,即使我一直都是root用户,但在输出如您所述的日志时,看不到任何归因于日志的日志行systemd/var/log/syslog也不显示任何内容。顺便说一下,这是系统215。
mindriot

3

您可以看到上一次服务启动或重新启动的时间。使用service chatty statussystemctl 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

1
service是旧的Upstart命令,可与systemd配合使用以实现兼容性。本机systemd命令是systemctl status apache2
Mark Stosberg '17

谢谢。不幸的是这只能说明,当被(重新)启动该服务,而不是原因 ; 并且还仅显示当前情况,即最后一次重启。
mindriot

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.