如何在不影响进程的情况下重命名 systemd 服务(无需停止/重新启动)

Val*_*ozz 6 systemd

必须在生产环境中重命名 systemd 服务有多种原因。例如:

  • 为了更好地将其与新产品区分开来
  • 因为你的老板命令了它
  • 因为遗留脚本
  • ...

假设创建/etc/systemd/system/foo.service并启用并启动了一个新的通用服务,如下所示:[1]

systemctl daemon-reload
systemctl enable --now foo
Run Code Online (Sandbox Code Playgroud)

然后,您可能希望将其从 重命名foo.servicebar.service,而不以任何方式影响相关进程。

在正常情况下,你可以这样做:

mv foo.service bar.service
systemctl daemon-reload
systemctl disable foo
systemctl enable  bar
Run Code Online (Sandbox Code Playgroud)

然后你得到:

  • systemctl status foo:running not-found disabled
  • systemctl status bar:not-running enabled

所以你可能想用以下方法修复:

systemctl stop  foo
systemctl start bar
Run Code Online (Sandbox Code Playgroud)

或者重新启动。但是在生产环境中这是不可行的,因为您不想因为此类更改而停止应用程序。此外,重启计划会在数月或数年后进行。同时,长时间保留这样的已停止服务是有风险的,bar在停止未找到的运行之前不应错误地启动该服务foo

简而言之。您会使用什么方法来重命名生产中的 systemd 服务?

理想的情况是这两种服务向后兼容。因此,停止foo也停止bar,反之亦然。


Håk*_*ist 7

可能有一些我不知道的更好的方法,但这是一种解决方法,在您有机会重新启动服务之前,它基本上可以满足您的需要:

  1. 使用所需的新名称创建一个指向现有服务文件(和systemctl daemon-reload)的符号链接。
    Systemd将单元的符号链接视为别名而不是单独的单元,这意味着两个名称现在将引用相同的单元(相同的状态,相同的一切)。
  2. 计划在下一个维护时段实际更换服务。