为什么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而不是其他“自定义”命令时选项会被删除?
答案 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