【问题标题】:Systemd dropping service start optionsSystemd 删除服务启动选项
【发布时间】:2017-02-21 07:25:55
【问题描述】:

为什么 systemd 在使用 'service start' 时会删除选项?

“服务”的手册页将服务命令定义为:

服务脚本命令[选项]

和状态

service 将 COMMAND 和 OPTIONS 未经修改地传递给 init 脚本。

现在为一些名为“foo”的服务使用这个初始化脚本:

#!/bin/sh

case "$1" in
        start)
                echo $2 >> output
        ;;
        someaction)          
                echo $2 >> output
        ;;
esac

exit 0

在使用 systemd 的系统上,在 daemon-reload 之后,service foo start bar 不会在输出文件中写入任何内容,而 service foo someaction bar 会按预期写入“bar”。 (在 Ubuntu 16.04 上测试)

在没有 systemd 的系统上,两个命令都按预期写入“bar”。 (在 Mint 17.1 上测试)

我敢打赌 stop 命令也是如此。

为什么在调用 start 而不是其他“自定义”命令时会删除选项?

【问题讨论】:

    标签: ubuntu service systemd linux-mint init.d


    【解决方案1】:

    service 命令是为 SysV 初始化脚本设计的,而不是 systemd。在基于systemd 的系统上,service 命令可能会继续作为填充程序存在,以将旧语法转换为新语法。在 Ubuntu 16.04 上,/usr/sbin/service 是一个 bash 脚本,因此您可以阅读源代码并查看它在哪里有 is_systemd 条件子句。在基于 systemd 的系统上查看 start 命令时,您会看到:

      systemctl $sctl_args ${ACTION} $unit
    

    换句话说,在这个翻译层中没有额外的参数被传递。

    基于systemd 的系统上service 的替换是systemctlsystemctl start your-service-name 用于启动服务。

    systemd 不支持添加自定义操作,但您可以轻松创建自定义units,然后您可以这样做:

    systemctl start myservice-someaction
    

    【讨论】:

    • 嗯,这就解释了。但是随后 service 命令不遵循它自己在 systemd-systems 上的规范。有没有办法通过 systemctl 传递参数?
    • 你是对的——man service 文档没有提到systemd,只有upstart,它也没有在 Ubuntu 16.04 上使用。不,您不能通过systemctl start 传递参数,只能创建新单元,然后在启动时将不同的选项传递给底层命令。该设计旨在鼓励提高事物在不同环境中运行方式的一致性。
    • 您可以考虑在 Ubuntu 16.04 中打开关于 service 不准确的 man 页面的错误报告。
    猜你喜欢
    • 2021-01-08
    • 2015-11-17
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多