我尝试将 Debian(以及 LinuxMint 和 Ubuntu & Co. 等衍生发行版)上使用的 SysVintit 脚本转换为在 Fedora 或 ArchLinux(以及 Bridge 或 Manjaro 等衍生发行版)上使用的 systemd 服务,但即使 systemd启动系统比以前的系统性能更高,用途更广泛,我不明白如何制作简单的东西,例如在命令行上使用“可选”参数,如 ExecStart= 或 ExecRestart= !
这是我对 SysVinit 所做的事情:
#!/bin/sh
### BEGIN INIT INFO
# Provides: myprog
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: myprog init script
# Descripton: this script manages myprog
### END INIT INFO
# exit if myprog isn't installed
[ -x "/opt/mystuff/myrpog" ] || exit 0
case "$1" in
start)
cd /opt/mystuff
./myprog -r
echo
;;
stop)
cd /opt/mystuff
./myprog -x
;;
restart)
cd /opt/mystuff
./myprog -x && ./myprog -r
;;
version)
cd /opt/mystuff
./myprog -v
;;
try)
cd /opt/mystuff
./myprog
;;
*)
echo "Usage: sudo service myprog {start|stop|version|try}" >&2
exit 3
;;
esac
:
因此,上面的脚本允许使用不同的参数,包括一个空参数,当使用以下命令行时将显示消息“Usage: ...”:
sudo service myprog start => start myprog with the -r argument
sudo service myprog stop => stop myprog with the -x argument
sudo service myprog version => display the release of myprog in the console
sudo service myprog try => start myprog without any argument
sudo service myprog restart => stop then start myprog with the -r argument
suso service myprog => display the "Usage:..." message in the console
现在,使用 systemd,脚本应该如下所示:
[Unit]
Description=This script manages myprog
ConditionFileExecutable=/opt/mystuff/myprog
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/mystuf/myprog -r
ExecStop=/opt/mystuff/myprog -x
ExecRestart=/opt/mystuff/myprog -x : /opt/mystuff/myprog -r
[Install]
After=NetworkManager.service
这里开始我的问题(以及我缺乏系统知识):
显然,systemd 没有提供诸如 ExecCustom01=、ExecCustom02 等命令,这些命令允许我为“version”和“try”(以及其他如果需要)创建命令。
因此,如果我可以使用参数来启动“版本”或“尝试”命令,我可以以不同的方式使用 ExecRestart(据说“真正的”重新启动可以通过连续启动停止和启动命令来完成)。
这些“定制”的 ExecRestart= 命令可能如下所示:
sudo systemctl restart myprog => without argument for the "try" command
和
sudo systemctl restart myprog -v => for the "version" command
systemd 脚本可能如下所示:
[Unit]
Description=This script manages myprog
ConditionFileExecutable=/opt/mystuff/myprog
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/mystuf/myprog -r
ExecStop=/opt/mystuff/myprog -x
ExecRestart=/opt/mystuff/myprog ????? // this is where I need to use an argument
[Install]
After=NetworkManager.service
但我不知道这是否可能,如果可以,使用的语法是什么!
任何帮助都将不胜感激,因为即使在多个 systemd 手册页中花费了几个小时后,我也找不到任何关于如何做到这一点的明确示例。
TIA 为您提供时间和建议。