系统删除服务启动选项

时间:2016-10-12 13:13:07

标签: ubuntu service systemd mint init.d

为什么systemd在使用'service start'时会丢弃选项?

'service'的man页面将service命令定义为:

  

服务脚本命令[选项]

和州

  

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

现在将这个init脚本用于名为“foo”的服务:

#!/bin/sh

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

exit 0

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

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

我认为停止命令也是如此。

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

1 个答案:

答案 0 :(得分:1)

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

  systemctl $sctl_args ${ACTION} $unit

换句话说,在此转换层中不会传递额外的参数。

基于service的系统systemd的替换为systemctl,其中systemctl start your-service-name用于启动服务。

systemd不支持添加自定义操作,但您可以轻松创建自定义units,这样您就可以执行此操作:

systemctl start myservice-someaction