在 Ubuntu 14 中,我有一堆SysV
初始化脚本 ( /etc/init.d/
)。
迁移到 Ubuntu 16 后,它们并没有真正工作,据我了解 Ubuntu 16 会systemd
动态生成单元文件。有些服务可以启动,有些则不能启动。
我的想法是:
重新定位
SysV
初始化脚本 (/etc/init.d/
->/var/lib/my-services/
) 并确保可以通过它们启动服务创建适当的
systemd
单元文件 (/etc/systemd/system
) 并使用重定位的SysV
初始化脚本 (/var/lib/my-services/
)
我可以重用SysV
初始化脚本吗?或者它们可以包含一些SysV
不适用于的特定内容systemd
吗?
更新#1:Ubuntu 16 上的 Apache2 开箱即用,附带SysV
初始化脚本 ( /etc/init.d/apache2
)。有systemd
Apache2 的例子吗?
答案1
systemd 具有一定的向后兼容性,但它不是一对一的。例如,在 SysV 初始化脚本中,您可以添加自定义子命令,但在 systemd 中则不能。
根据我的经验,如果您尝试保持那些旧的初始化脚本正常运行,您可能会遇到额外的调试或奇怪的行为。
我认为从长远来看,通过将初始化脚本重写为 systemd 单元文件,您可以节省时间。
如果您使用标准的第三方软件,则该项目很可能已经提供了您可以使用的自己的 systemd 单元文件。
答案2
systemd 与 SysV 初始化脚本的兼容性由systemd-sysv-生成器,它会动态编写 systemd 单元,使用适当的参数调用 init 脚本来实现启动/停止/重新加载。
为了完成其工作,systemd-sysv-generator 在很大程度上依赖于LSB 标头SysV 初始化脚本,如下所示:
### BEGIN INIT INFO
# Provides: lsb-ourdb
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop OurDB
# Description: OurDB is a very fast and reliable database
# engine used for illustrating init scripts
### END INIT INFO
如果您的 SysV 初始化脚本没有正确的 LSB 标头,则 systemd-sysv-generator 可能无法很好地将其自动转换为 systemd 单元...
systemd-sysv-generator 生成的单元将存储在 下/run/systemd/system
,因此您可以在那里查找该*.service
文件,或者仅使用该systemctl cat
命令列出该单元的内容。您还可以使用该systemctl edit
命令将覆盖添加到从 SysV 初始化脚本生成的单元。 (例如,如果您想向单元添加额外的依赖项或排序指令,这很有用。)
但也许冒险将 SysV 初始化脚本转换为本机 systemd 单元是一种更好的方法,并且会得到长期回报,特别是如果该命令能够在前台运行(而不是守护进程)并且 SysV 初始化脚本正在对命令进行守护进程(在这种情况下,systemd 可以做得更好,如果它本身守护命令,效果会更好。)
查看Fedora 杂志中的这篇文章有关如何将 SysV init 脚本转换为 systemd 单元的提示和技巧,希望这能帮助您入门。如果您在尝试转换初始化脚本时遇到困难,请不要犹豫,回到这里询问更多细节。祝你好运!