我对编写与systemd兼容的初始化脚本很陌生。我尝试了以下示例:
#!/bin/sh
#
### BEGIN INIT INFO
# Provides: test
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Test.
# Description: Test.
### END INIT INFO
#
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
case "$1" in
stop)
log_failure_msg "Stop!"
exit 1
;;
start)
log_failure_msg "Start!"
exit 1
;;
restart)
log_failure_msg "Restart!"
exit 1
;;
status)
log_failure_msg "Status!"
exit 1
;;
*)
echo "Usage: $SELF start|stop|restart|status"
exit 1
;;
esac
# Some success paths end up returning non-zero, so exit 0 explicitly. See bug #739846.
exit 0
到现在为止还挺好。现在,我像这样安装init脚本:
update-rc.d test defaults
update-rc.d test enable
再一次,到目前为止,很好。我已经将这个初始化脚本专门设置为失败(在测试期间必须这样做以确认我遇到的问题。)
如果我运行/etc/init.d/test start,它会按预期失败,并且我可以在日志中看到错误消息。
但是,如果我运行/etc/init.d/test stop,则日志中什么也没有,脚本成功返回。
似乎systemd在幕后进行某种黑魔法,并以某种方式劫持,但我不知道怎么做,而且我一直在谷歌搜索中一直没有成功。谁能帮助我了解为什么在我的case块中传递stop到我的init脚本不执行相应的代码?
附带说明,状态选项也不起作用(systemd仅输出其自己的状态信息。)
我正在尝试在Ubuntu 16.04上运行它。谢谢!
您会注意到脚本的顶部已加载/lib/lsb/init-functions
。您可以阅读其中的代码以及其中的相关代码,/lib/lsb/init-functions.d
以了解要插入的相关代码。
总结是,您的脚本可能会systemd
.service
在后台转换为,并且受制于与Systemd兼容的大量文档记载的不兼容性。
当您要求systemd模拟和支持旧系统Upstart
和sysVinit
init系统使用的文件格式时,会带来额外的复杂性和潜在的问题。
由于您是从头开始编写新的初始化脚本,因此请考虑systemd
.service
直接编写文件,从而消除了涉及其他初始化系统的所有其他复杂性。
输入的最小.service
文件/etc/systemd/system/
如下所示:
[Unit]
Description=Foo
[Service]
ExecStart=/usr/sbin/foo-daemon
[Install]
WantedBy=multi-user.target
中的更多详细信息man systemd.service
。现在进行一些额外的学习将为您节省以后的调试工作!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句