Systemd 删除服务启动选项

Systemd dropping service start options

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

'service' 的手册页将服务命令定义为:

service SCRIPT COMMAND [OPTIONS]

和状态

service passes COMMAND and OPTIONS to the init script unmodified.

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

#!/bin/sh

case "" in
        start)
                echo  >> output
        ;;
        someaction)          
                echo  >> output
        ;;
esac

exit 0

在使用 systemd 的系统上,守护程序重新加载后,service foo start bar 不会在输出文件中写入任何内容,而 service foo someaction bar 按预期写入 "bar"。 (在 Ubuntu 16.04 上测试)

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

我敢打赌停止命令也是如此。

为什么在调用 start 时会删除选项而不是其他 "custom" 命令?

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