我可以使用 systemd 的 SysV 初始化脚本吗

我可以使用 systemd 的 SysV 初始化脚本吗

在 Ubuntu 14 中,我有一堆SysV初始化脚本 ( /etc/init.d/)。

迁移到 Ubuntu 16 后,它们并没有真正工作,据我了解 Ubuntu 16 会systemd动态生成单元文件。有些服务可以启动,有些则不能启动。

我的想法是:

  1. 重新定位SysV初始化脚本 ( /etc/init.d/-> /var/lib/my-services/) 并确保可以通过它们启动服务

  2. 创建适当的systemd单元文件 ( /etc/systemd/system) 并使用重定位的SysV初始化脚本 ( /var/lib/my-services/)

我可以重用SysV初始化脚本吗?或者它们可以包含一些SysV不适用于的特定内容systemd吗?

更新#1:Ubuntu 16 上的 Apache2 开箱即用,附带SysV初始化脚本 ( /etc/init.d/apache2)。有systemdApache2 的例子吗?

答案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 单元的提示和技巧,希望这能帮助您入门。如果您在尝试转换初始化脚本时遇到困难,请不要犹豫,回到这里询问更多细节。祝你好运!

相关内容