Systemd + Sys V init.d脚本:启动工作,但不停止

时间:2018-04-09 11:17:12

标签: ubuntu-16.04 init systemd upstart

我非常擅长编写兼容系统的init脚本。我尝试过以下示例:

#!/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停止,我的日志中什么都没有,脚本会成功返回。

似乎systemd在幕后做了某种黑魔法并且以某种方式劫持了停止,但我无法弄清楚如何,并且我一直在谷歌上搜索没有成功。谁能帮助我理解为什么传递stop到我的init脚本不会在我的case块中执行相应的代码?

作为旁注,状态选项也不起作用(systemd只输出自己的状态信息。)

我试图在Ubuntu 16.04上运行它。谢谢!

1 个答案:

答案 0 :(得分:2)

您会注意到脚本的顶部加载了/lib/lsb/init-functions。您可以阅读其中的代码以及/lib/lsb/init-functions.d中的相关代码,以了解您要提取的相关代码。

摘要是您的脚本可能在后台转换为systemd .service,并受whole host of documented incompatibilities with systemd

的约束

当您要求systemd模拟并支持旧UpstartsysVinit init系统使用的文件格式时,会继承额外的复杂性和潜在问题。

由于您是从头开始编写新的init脚本,因此请考虑直接编写systemd .service文件,从而消除涉及其他init系统的所有其他复杂性。

.service中的最小/etc/systemd/system/文件可能如下所示:

[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

[Install]
WantedBy=multi-user.target

man systemd.service中的更多详细信息。现在一些额外的学习将为您节省一些调试时间!