代码之家  ›  专栏  ›  技术社区  ›  Crankycyclops

系统D+系统V初始化。d脚本:开始工作,但停止不工作

  •  2
  • Crankycyclops  · 技术社区  · 6 年前

    我对编写与systemd兼容的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。测试开始时,它按预期失败,我可以在日志中看到错误消息。

    但是,如果我运行/etc/init。测试停止,我的日志中没有任何内容,脚本成功返回。

    似乎systemd在幕后施展了某种黑魔法,并以某种方式劫持了stop,但我不知道怎么做,我一直在谷歌上搜索,但始终没有成功。有人能帮助我理解为什么将stop传递给init脚本不会执行case块中的相应代码吗?

    另外,status选项也不起作用(systemd只输出自己的状态信息)

    我正试图在Ubuntu 16.04上运行这个。非常感谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Mark Stosberg    6 年前

    您会注意到脚本加载的顶部 /lib/lsb/init-functions 。您可以读取其中的代码和中的相关代码 /lib/lsb/init-functions.d 了解您正在引入的相关代码。

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

    当您要求systemd模拟和支持遗留系统使用的文件格式时,会有额外的继承复杂性和潜在的问题 Upstart sysVinit 初始化系统。

    由于您是从头开始编写新的init脚本,请考虑编写 系统D 服务 文件,消除了涉及其他init系统的所有额外复杂性。

    最小值 服务 要进入的文件 /etc/systemd/system/ 可能看起来像:

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

    更多详细信息,请参见 man systemd.service 。现在进行一些额外的学习将节省您以后的一些调试!