我尝试将Debian上使用的SysVintit脚本(以及LinuxMint和Ubuntu&Co.等衍生产品发行版)转换为Fedora或ArchLinux(以及Bridge或Manjaro等衍生发行版)上使用的系统服务,但即使是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
:
Run Code Online (Sandbox Code Playgroud)
因此,上面的脚本允许使用不同的参数,包括一个空的参数,当使用以下命令行时,它将显示消息"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
Run Code Online (Sandbox Code Playgroud)
现在,使用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
Run Code Online (Sandbox Code Playgroud)
这里开始我的问题(以及我缺乏系统知识):
显然,systemd不提供ExecCustom01 =,ExecCustom02等命令,这些命令允许我为"version"和"try"创建命令(如果需要,还可以创建其他命令).
所以,如果我可以使用一个参数来启动"版本"或"尝试"命令(可以通过连续启动stop和start命令来完成"真正的"重启),我可以在不同的maner中使用ExecRestart. ).
这些"自定义"的ExecRestart =命令可能如下所示:
sudo systemctl restart myprog => without argument for the "try" command
Run Code Online (Sandbox Code Playgroud)
和
sudo systemctl restart myprog -v => for the "version" command
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但我不知道是否可能,如果是的话,使用的语法是什么!
任何帮助都会受到很多人的欢迎,因为即使在多个系统的手册页中花了很多时间,我也找不到任何关于如何做到这一点的明确示例.
TIA为您的时间和建议.
Hub*_*tus 22
虽然systemd确实没有提供传递单元文件的命令行参数的方法,但是有可能编写实例:http://0pointer.de/blog/projects/instances.html
例如:/lib/systemd/system/serial-getty@.service看起来像这样:
[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
Run Code Online (Sandbox Code Playgroud)
所以,你可以像下面这样开始:
$ systemctl start serial-getty@ttyUSB0.service
$ systemctl start serial-getty@ttyUSB1.service
Run Code Online (Sandbox Code Playgroud)
对于systemd,它将是不同的实例:
$ systemctl status serial-getty@ttyUSB0.service
serial-getty@ttyUSB0.service - Getty on ttyUSB0
Loaded: loaded (/lib/systemd/system/serial-getty@.service; static)
Active: active (running) since Mon, 26 Sep 2011 04:20:44 +0200; 2s ago
Main PID: 5443 (agetty)
CGroup: name=systemd:/system/getty@.service/ttyUSB0
? 5443 /sbin/agetty -s ttyUSB0 115200,38400,9600
Run Code Online (Sandbox Code Playgroud)
这也意味着很有可能启用和单独禁用它.
当然,它缺乏命令行解析的强大功能,但通常它被用作某种配置文件选择.例如,您可以查看Fedora openvpn @ .service:http://pkgs.fedoraproject.org/cgit/openvpn.git/tree/openvpn@.service
小智 2
直接尝试命令行参数是不可能的。
一种替代方案可能是环境变量(https://superuser.com/questions/728951/systemd-giving-my-service-multiple-arguments)。
这是我找到答案的地方: http ://www.freedesktop.org/software/systemd/man/systemctl.html
所以sudo systemctl restart myprog -v——systemctl 会认为你正在尝试设置它的标志之一,而不是 myprog 的标志。
sudo systemctl restart myprog someotheroption-- systemctl 将重新启动 myprog 和 someotheroption 服务(如果存在)。
| 归档时间: |
|
| 查看次数: |
92818 次 |
| 最近记录: |