【问题标题】:Automatically restart a service after unattended updates under systemdsystemd下无人值守更新后自动重启服务
【发布时间】:2018-07-07 10:06:42
【问题描述】:

我添加了一个服务(在本例中为 Seafile),我希望它一直运行到带有服务文件的 systemd 中。它运行良好,但每次运行无人参与的更新时,服务都会正常关闭 - 但从未重新启动。

服务文件如下所示:

[Unit]
Description=Seafile
Requires=mysql.service
After=mysql.service

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=root
Group=root
PermissionsStartOnly=true
ExecStart=/srv/start-seafile
TimeoutSec=600
Restart=on-failure

/srv/start-seafile 看起来像这样:

#!/bin/bash

cd /srv/seafile/XXXX/seafile-server-latest && nohup ./seafile.sh start

就像我说的 - 这很完美 - systemd 可以启用/禁用/启动/停止服务,了解它是否已启动/正在运行 - 所以我必须做一些正确的事情。

# systemctl start seafile
# systemctl status seafile
* seafile.service - Seafile
   Loaded: loaded (/etc/systemd/system/seafile.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2018-01-28 17:53:51 CET; 8s ago
  Process: 6569 ExecStart=/srv/start-seafile (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/seafile.service
       |-6598 /srv/seafile/XXXX/seafile-server-5.1.4/seafile/bin/seafile-controller -c /srv/seafile/XXXX/ccnet -d /volume1/Seafile -F /srv/seafile/XXXX/conf
       |-6600 ccnet-server -F /srv/seafile/XXXX/conf -c /srv/seafile/XXXX/ccnet -f /srv/seafile/XXXX/logs/ccnet.log -d -P /srv/seafile/XXXX/pids/ccnet.pid
       `-6602 seaf-server -F /srv/seafile/XXXX/conf -c /srv/seafile/XXXX/ccnet -d /volume1/Seafile -l /srv/seafile/XXXX/logs/seafile.log -P /srv/seafile/XXXX/pids/seaf-server.pid

Jan 28 17:53:48 XXXX systemd[1]: Starting Seafile...
Jan 28 17:53:48 XXXX start-seafile[6569]: [01/28/18 17:53:48] ../common/session.c(132): using config file /srv/seafile/XXXX/conf/ccnet.conf
Jan 28 17:53:48 XXXX start-seafile[6569]: Starting seafile server, please wait ...
Jan 28 17:53:51 XXXX start-seafile[6569]: Seafile server started
Jan 28 17:53:51 XXXX start-seafile[6569]: Done.
Jan 28 17:53:51 XXXX systemd[1]: Started Seafile.

但是,每次出现无人参与的更新时,都会发生这种情况:

Jan 23 06:38:08 XXXX systemd[1]: Starting Daily apt activities...
Jan 23 06:40:13 XXXX systemd[1]: Reloading.
Jan 23 06:40:13 XXXX systemd[1]: Stopping Seahub...
Jan 23 06:40:14 XXXX systemd[1]: Stopped Seahub.
Jan 23 06:40:14 XXXX systemd[1]: Stopping Seafile...
Jan 23 06:40:15 XXXX systemd[1]: Stopped Seafile.
Jan 23 06:40:15 XXXX systemd[1]: Stopping MySQL Community Server...
Jan 23 06:40:16 XXXX systemd[1]: Stopped MySQL Community Server.
Jan 23 06:40:17 XXXX systemd[1]: Reloading.
Jan 23 06:40:17 XXXX systemd[1]: Stopped MySQL Community Server.
...
Jan 23 06:40:43 XXXX systemd[1]: Reloading.
Jan 23 06:40:44 XXXX systemd[1]: Stopped MySQL Community Server.
Jan 23 06:40:44 XXXX systemd[1]: Reloading.
Jan 23 06:40:44 XXXX systemd[1]: Reloading.
Jan 23 06:40:44 XXXX systemd[1]: Starting MySQL Community Server...
Jan 23 06:40:45 XXXX systemd[1]: Started MySQL Community Server.
Jan 23 06:40:47 XXXX systemd[1]: Reloading.
Jan 23 06:40:48 XXXX systemd[1]: Stopping MySQL Community Server...
Jan 23 06:40:49 XXXX systemd[1]: Stopped MySQL Community Server.
Jan 23 06:40:49 XXXX systemd[1]: Starting MySQL Community Server...
Jan 23 06:40:50 XXXX systemd[1]: Started MySQL Community Server.
(... continues with unrelated services )

所以它意识到 Seafile 需要在 MySQL 之前停止,并这样做,但在重新启动 MySQL 后不再启动它。

有没有人知道是什么原因造成的? IE。什么情况下 systemd 服务会在更新过程中停止,但不会重新启动?

【问题讨论】:

  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • @jww 请不要对问题投反对票,因为它们是题外话。一个关闭标志就足够了。
  • @jww 我不同意。我正在编写自己的服务文件。但是 gj 经历了像 stackoverflow.com/questions/21830670/… 这样的老问题 - 也在 SO - 就像相关问题中的六个其他问题一样 - 并且也投票否决了它们。你让我非常想参加。不是。

标签: linux ubuntu service auto-update systemd


【解决方案1】:

如果您希望它始终运行,请使用Restart=always。当mysql 服务更新发生时,此服务会执行干净的stop,因此systemd 不会重新启动它。您设置了Restart=on-failure,只有在停止的返回码不是0 时才会重新启动。

Restart = always
RestartSec = 10

重启安全
配置重新启动服务之前的睡眠时间(如使用 Restart= 配置的那样)。采用以秒为单位的无单位值,或时间跨度值,例如“5min 20s”。默认为 100 毫秒。

【讨论】:

  • 我确实希望它一直运行——但这真的是唯一的方法吗?如果我出于某种原因手动停止服务,Restart=always 是否也会重新启动它?如果不是,我停止服务和 apt 的无人值守更新停止服务有什么不同?澄清一下-似乎这可以解决症状(服务关闭->重新启动)而不是原因(为什么更新后服务没有像MySQL一样重新启动?mysql.service文件有“Restart = on-failure”也在里面)
  • 更新后重新启动MySQL 是一个打包时间触发器,例如在更新包时运行的rpm %post 脚本。然而,如果您在 systemd 之外停止 MySQL,它不会自行重启。
  • @jww 好吧!显然......尤其是对于一个明显偏离主题的问题,虽然这个问题不是......看起来你只是“少数”,而不是“一些”......
  • 以及您为此获得了多少反对票。你回答的很多关于openssl的问题都应该属于unix&linux,不要说任何公平,你是在辱骂。
  • 好吧,我当然没有对你投反对票。编写我自己的服务文件——我明确表示我这样做了——也不是“管理”“超级用户”的东西。如果人们只是想摆弄他们的 e-p,我希望他们在诚实、精心编写的问题之外这样做。是的,我确实考虑过其他网站。是的,我确实考虑编写自己的服务文件作为我编程活动的一部分。因此,经过考虑,我在此网站上发布。这里绝对是一个充满敌意的环境。接受 +10 代表的投票,这就是我所能做的。
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 2017-01-29
  • 2015-11-17
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多