如何configurationsystemd杀死并重新启动守护进程?

我有一个守旧的守护进程,我想用systemd来控制。 当它的configuration文件改变时,它需要被终止并重新启动。 换句话说,在编辑configuration文件后, systemctl reload MYSERVICE应该systemctl reload MYSERVICE进程并重新启动它。

尝试1:尝试默认值。 这告诉systemd如何启动守护进程,但不知道如何重新加载它。

 [Service] ExecStart=/usr/bin/MYSERVICE Type=simple 

因此, startrestart工作,但reload给出了这个错误:

 # systemctl reload MYSERVICE Failed to reload MYSERVICE.service: Job type reload is not applicable for unit MYSERVICE.service. 

尝试2:告诉它如何杀死进程。 这杀死了进程,但systemd不会重新启动我。

 [Service] ExecStart=/usr/bin/MYSERVICE Type=simple ExecReload=/bin/kill -HUP $MAINPID 

…其次是…

 # systemctl daemon-reload # systemctl reload MYSERVICE 

杀死进程,但不会自动重启。

尝试3:使用ExecReload也重新启动过程。 这失败的原因有几个:

 ExecReload=/bin/kill -HUP $MAINPID ; /usr/bin/MYSERVICE 

…我得到的错误信息…:

 # systemctl daemon-reload # systemctl reload MYSERVICE Job for MYSERVICE.service failed because the control process exited with error code. See "systemctl status MYSERVICE.service" and "journalctl -xe" for details. 

我期望有一个ReloadType = kill_and_restart或者其他东西,但没有这样的运气。

如何告诉systemd杀死并重新启动守护进程?

答案是,“你不”! 但是,我们有好消息。

systemd的哲学是重载是可选的,如果没有真正的重载function,应该保持不确定。 我将“真正的重新加载function”定义为重新加载,不会终止并重新启动服务,或者使服务更改其PID。 换句话说,systemd只是想反映存在的function。

相反,你应该使用systemctl reload-or-restart ,如果它存在,将会重新加载,如果不存在则重新启动。

从手册页…

  reload-or-restart PATTERN... Reload one or more units if they support it. If not, restart them instead. If the units are not running yet, they will be started. reload-or-try-restart PATTERN... Reload one or more units if they support it. If not, restart them instead. This does nothing if the units are not running. Note that, for compatibility with SysV init scripts, force-reload is equivalent to this command. 

因此:(1)将ExecReload留空,(2)使用systemctl reload-or-restart MYSERVICE ,(3)您应该全部设置。

如果您尝试使用ExecReload来定义杀死并重新启动服务的方法,则会有一个新的PID,systemd将会被混淆。

systemd的理念是reload是可选的,systemd的用户应该知道每个服务是否应该调用reload或者通过调用restart伪造它。

因此,你的问题的答案是:“不行,不应该,下一层请解决。”

换句话说,如果底层服务支持真正的重新加载function,systemd希望只实现“ 重新加载 ”(reload)function,即不重新启动服务或重新启动服务的重新加载。 换句话说,systemd只是想反映存在的function。

您可能会问自己:但是,如果我可以通过允许ExecReload杀死并重新启动服务来实现“假”重新加载,会不会更容易? 那么我可以使用systemctl reload FOO为我的所有服务systemctl reload FOO ,我不必记得哪些支持它,哪些不支持?

是的,那样会容易些,但是这不会是系统化的。 Systemd希望调用者知道服务是否存在reload 。 Systemd希望成为存在的function的通用接口,它不想填补空白。

例如,puppet假定一个systemd驱动的服务没有reload并且默认是查杀和重新启动进程 。 如果Service []types添加了一种方法来指定重新加载存在,并且它应该用于通知,它将需要了解哪些服务有或没有本地重新加载。 厨师和所有其他系统也必须学习相同的东西,因为systemd希望在这一层解决。 (MiniRant:为了启动一个进程系统似乎是所有知名的,全部安装的,全名称空间定制的i-do-all-at-my-my-layer-system,所以我不能告诉你为什么它不把这个理念延伸到重新加载,也许其中一个作者可以在这里join。)