在systemd下无人值守更新后自动重启服务

3
我已经添加了一个服务(在此例中是Seafile),我希望它能随时运行,并使用一个service文件将其添加到systemd。它运行得很好,但每当无人值守的更新运行时,该服务会被正确关闭,但从未重新启动。
以下是service文件的内容:
[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 )

因此,它意识到在停止MySQL之前需要停止Seafile,但在重新启动MySQL后不再启动Seafile。

有没有人有任何经验知道是什么原因导致这种情况?即,在更新期间systemd服务将停止,但不会重新启动的情况下?


Stack Overflow是一个编程和开发问题的网站。这个问题似乎不属于编程或开发,因此不在范围内。请参阅帮助中心中的可以在这里询问哪些主题。也许Super UserUnix&Linux Stack Exchange更适合提问。 - jww
1
@jww请不要因为问题不在话题范围内就对其进行投票贬低。使用关闭标志就足够了。 - iamauser
1
@jww 我不同意。我正在编写自己的服务文件。但是,像 https://dev59.com/sGEh5IYBdhLWcg3w9Xen 这样一年前的问题,以及其他半打相关问题中的问题 - 也在 SO 上 - 并且还将它们投票否定。你让我非常想参与 SO。并不是这样的。 - Aaa
1个回答

3

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

Restart = always
RestartSec = 10

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


我仍然不明白使用systemd干净地关闭服务和无人值守更新干净地关闭服务之间有何不同。在前一种情况下,我不想让它重新启动,在后一种情况下,我会这样做。问题更多的是,在更新期间,Seafile和MySQL都被适当地关闭,但只有MySQL被重新启动,即使两者在其服务文件中都有“Restart = on-failure”。 - Aaa
1
MySQL在更新后的重启是一个打包时间触发器,就像rpm%post脚本一样,在软件包更新时运行。然而,如果你在systemd之外停止了MySQL,它将不会自动重启。 - iamauser
1
@jww 嗯!显然...特别是对于一个明显不相关的问题,而这个问题却不是...看起来你只是“几个”,而不是“一些”... - iamauser
1
你因此得到了多少个踩的?你回答关于 OpenSSL 的许多问题应该属于 Unix&Linux,不要说这是公平的,你在滥用权力。 - iamauser
3
我肯定没有给你的帖子点踩。我自己编写服务文件——我明确表示了这一点——也不算是"管理员"或"超级用户"的工作。如果人们只是想展示他们的电子权力,我希望他们能在诚实、认真撰写的问题之外进行。是的,我考虑过其他网站。是的,我认为编写自己的服务文件是我的编程活动的一部分。因此,在考虑之后,我在这个网站上发帖。这里绝对是一个敌对的环境。有一个加10声望的接受投票,这是我所能做的。 - Aaa
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接