我尝试将 Debian(以及衍生发行版,例如 Linux Mint 和 Ubuntu & Co.)上使用的 SysVinit 脚本转换为在 Fedora 或 Arch Linux(以及衍生发行版,例如 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
:
因此上面的脚本允许使用不同的参数,包括一个空参数,在使用以下命令行时将显示消息“用法:...”:
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
sudo 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 手册页上花费了大量时间之后,我也找不到任何关于如何做到这一点的明确示例。
预先感谢您的时间和建议。
虽然 systemd 确实没有提供为单元文件传递命令行参数的方法,但可以编写 instances: http://0pointer.de/blog/projects/instances.html
例如:
/lib/systemd/system/[email protected]
看起来像这样:
[Unit]
Description=Serial Getty on %I
BindTo=dev-%i.device
After=dev-%i.device systemd-user-sessions.service
[Service]
ExecStart=-/sbin/agetty -s %I 115200,38400,9600
Restart=always
RestartSec=0
所以,你可以这样开始:
$ systemctl start [email protected]
$ systemctl start [email protected]
systemd 将启动 serial-getty
服务的不同
实例:
$ systemctl status [email protected]
[email protected] - Getty on ttyUSB0
Loaded: loaded (/lib/systemd/system/[email protected]; static)
Active: active (running) since Mon, 26 Sep 2011 04:20:44 +0200; 2s ago
Main PID: 5443 (agetty)
CGroup: name=systemd:/system/[email protected]/ttyUSB0
└ 5443 /sbin/agetty -s ttyUSB0 115200,38400,9600
它还可以单独启用和禁用实例化服务。
当然,它缺乏命令行解析的很多功能,但通常它被用作某种配置文件选择。例如,您可以查看 Fedora
[email protected]
: http://pkgs.fedoraproject.org/cgit/openvpn.git/tree/[email protected]
直接尝试命令行参数是不可能的。
另一种选择可能是环境变量(https://superuser.com/questions/728951/systemd-giving-my-service-multiple-arguments)。
这是我找到答案的地方: http://www.freedesktop.org/software/systemd/man/systemctl.html
so
sudo systemctl restart myprog -v
——systemctl 会认为你正在尝试设置它的标志之一,而不是 myprog 的标志。
sudo systemctl restart myprog someotheroption
-- systemctl 将重新启动 myprog 和 someotheroption 服务(如果存在)。
很晚才回答,但之前没有提到。以下允许您向 systemd 发送多个命令行参数以创建服务模板的实例。使用
systemd-escape
:
systemctl start $(systemd-escape --template [email protected] "prog.sh arg1 arg2 arg3")
或在多功能 shell 脚本中使用:
systemctl $action $(systemd-escape --template [email protected] "${app_name} ${app_args}"
在 .service 文件中我们有:
[Service]
ExecStart = /bin/sh -c /home/user/%I
归功于: [1]:https://www.baeldung.com/linux/systemd-multiple-parameters