Systemd + Sys V init.d脚本:启动有效,但停止无效

恶作剧

我对编写与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模拟和支持旧系统UpstartsysVinitinit系统使用的文件格式时,会带来额外的复杂性和潜在的问题

由于您是从头开始编写新的初始化脚本,因此请考虑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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在systemd中禁用init.d脚本

删除Sys-V-Init脚本,改用rc.local。应用程序仍然可以正确关闭吗?

Python sys.stdout无法用于init.d脚本

systemd如何使用/etc/init.d脚本?

防止在 systemd 中启用旧版 init 脚本

如何将init脚本转换为systemd?

将 /etc/init.d 服务转换为 systemd

没有systemd / init时如何关机(例如,使用init = / bin / bash)?

chroot之后卸载sys / fs / cgroup / systemd,而无需重新启动

systemd[1] 无法在 /sys/fs/cgroup 挂载 tmpfs 没有这样的文件或目录

使用python进行流程管理:执行服务或systemd或init.d脚本

安装systemd-services并在启动时更改init参数后无法启动

对“ /etc/init.d”和“ / lib / systemd / system”中的服务感到困惑

在系统中同时运行systemd,upstart和init.d是否适得其反?

服务器15.10-“无论启动什么服务”都不会启动/etc/init.d/中的“无论如何”系统V init脚本

如何在没有root身份验证的情况下在systemd下运行init.d服务(已更新)

如何从/ sys / fs / cgroup文件系统读取systemd MemoryHigh值?

使用最近的 Raspberry OS 创建 ramdisk 会导致“系统尚未使用 systemd 作为 init 系统启动...”错误消息

启动/停止没有root访问权限的init.d脚本

(术语)init.d脚本= LSB初始化脚本=系统V初始化脚本?

Systemd Postgresql启动脚本

Systemd无法启动脚本?

生成systemd服务文件后,init服务无法启用

什么使systemd与其他init系统区分开?

知道systemd是否确实是默认init的方法

在cloud-init中创建systemd单元并启用它

停止 systemd 读取分区

cloud-init 的配置无效,但显然仍然有效——如何删除警告?

无法启动systemd服务