在生产环境中,有多种原因需要重命名 systemd 服务。例如:
- 以便更好地将其与新产品区分开来
- 因为你的老板命令你这么做
- 由于遗留脚本
- ...
假设在中创建了一个新的通用服务/etc/systemd/system/foo.service
,并按如下方式启用和启动它:[1]
systemctl daemon-reload
systemctl enable --now foo
然后,您可能希望将其重命名foo.service
为bar.service
而不以任何方式影响相关流程。
在正常情况下,你可以这样做:
mv foo.service bar.service
systemctl daemon-reload
systemctl disable foo
systemctl enable bar
然后你将获得:
systemctl status foo
:running
not-found
disabled
systemctl status bar
:not-running
enabled
因此您可能需要修复:
systemctl stop foo
systemctl start bar
或者重启。然而,在生产环境中,这是不可行的,因为你不想因为这样的变化而停止应用程序。此外,重启计划在几个月或几年后进行。同时,bar
在停止未找到的运行之前,长时间保留不应被错误启动的已停止服务是有风险的foo
。
简而言之。你会使用什么方法来重命名生产中的 systemd 服务?
理想的情况是两个服务向后兼容。因此,停止foo
也会停止bar
,反之亦然。
答案1
可能还有一些我不知道的更好的方法,但我想到这个解决方法,在您有机会重新启动服务之前,它可以主要为您提供所需的服务:
-
创建具有所需新名称的符号链接,指向现有的服务文件(和
systemctl daemon-reload
)。Systemd
将单元的符号链接视为别名而不是单独的单位,这意味着两个名称现在指的是同一个单位(相同的状态,相同的一切)。 - 计划在下一次维护期间实际替换该服务。