【问题标题】:Systemd + Sys V init.d script: start works, but stop does notSystemd + Sys V init.d 脚本:启动有效,但停止无效
【发布时间】:2018-09-18 18:39:46
【问题描述】:

我对编写与 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

到目前为止,一切都很好。现在,我像这样安装初始化脚本:

update-rc.d test defaults
update-rc.d test enable

再一次,到目前为止,一切都很好。我已经将此初始化脚本专门设置为失败(我在测试期间必须这样做以确认我遇到的问题。)

如果我运行 /etc/init.d/test start,它会按预期失败,并且我可以在日志中看到错误消息。

但是,如果我运行 /etc/init.d/test stop,我的日志中什么也没有,并且脚本成功返回。

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

附带说明一下,状态选项也不起作用(systemd 只输出自己的状态信息。)

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

【问题讨论】:

    标签: ubuntu-16.04 init systemd upstart


    【解决方案1】:

    您会注意到脚本顶部加载了/lib/lsb/init-functions。您可以阅读那里的代码和/lib/lsb/init-functions.d中的相关代码,以了解您要拉入的相关代码。

    总结一下,您的脚本很可能在后台被转换为systemd .service 并受whole host of documented incompatibilities with systemd 约束

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

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

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

    [Unit]
    Description=Foo
    
    [Service]
    ExecStart=/usr/sbin/foo-daemon
    
    [Install]
    WantedBy=multi-user.target
    

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

    【讨论】:

    • 看起来我的用例确实属于该不兼容列表。我希望在这里使用我现有的初始化脚本知识,但看起来我最好以新格式编写服务。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2011-04-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多