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

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

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

  • 以便更好地将其与新产品区分开来
  • 因为你的老板命令你这么做
  • 由于遗留脚本
  • ...

假设在中创建了一个新的通用服务/etc/systemd/system/foo.service,并按如下方式启用和启动它:[1]

systemctl daemon-reload
systemctl enable --now foo

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

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

mv foo.service bar.service
systemctl daemon-reload
systemctl disable foo
systemctl enable  bar

然后你将获得:

  • systemctl status foorunning not-found disabled
  • systemctl status barnot-running enabled

因此您可能需要修复:

systemctl stop  foo
systemctl start bar

或者重启。然而,在生产环境中,这是不可行的,因为你不想因为这样的变化而停止应用程序。此外,重启计划在几个月或几年后进行。同时,bar在停止未找到的运行之前,长时间保留不应被错误启动的已停止服务是有风险的foo

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

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


答案1

可能还有一些我不知道的更好的方法,但我想到这个解决方法,在您有机会重新启动服务之前,它可以主要为您提供所需的服务:

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

相关内容