我目前正在将我的开发平台迁移到 Ubuntu Xenial,但我不知道 Ubuntu 如何将 init.d 脚本与 systemd 集成。例如,看看这个包含在基础存储库中的 MariaDB 的唯一服务重启。
root@xenial:/etc/init.d# /etc/init.d/mysql restart
[ ok ] Restarting mysql (via systemctl): mysql.service.
我查看了脚本,完全看不出它是如何调用 systemd 的。那么它做了哪些黑客行为来使其“与 systemctl”集成?
这让我真正想要做的是能够向 systemd 传递一个参数。
那么 Ubuntu Xenial 的 init 与 systemd 的集成总体进展如何?或者它真的只是一系列向后兼容的黑客行为。我原本以为一切都已转换为这些新的服务文件。
答案1
该init.d
脚本从 LSB 包中获取一些 bash 函数
. /lib/lsb/init-functions
从其他包中加载其他包
# Include hooks from other packages in /lib/lsb/init-functions.d
for hook in $(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null); do
[ -r $hook ] && . $hook || true
done
systemd 在其中注入自己的重定向
~$ dpkg -S /lib/lsb/init-functions.d/40-systemd
systemd: /lib/lsb/init-functions.d/40-systemd
笔记:发现使用strace /etc/init.d/.. status