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
的替代品是 systemctl
,systemctl start your-service-name
用于启动服务。
systemd
不支持添加自定义操作,但您可以轻松创建自定义操作 units
,因此您可以执行以下操作:
systemctl start myservice-someaction
为什么 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
的替代品是 systemctl
,systemctl start your-service-name
用于启动服务。
systemd
不支持添加自定义操作,但您可以轻松创建自定义操作 units
,因此您可以执行以下操作:
systemctl start myservice-someaction