如何在Execstart命令行中使用参数



我尝试转换在debian上使用的sysvinit脚本(以及诸如linux mint和ubuntu& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;诸如桥梁或manjaro之类的衍生发行版),但是即使SystemD启动系统比以前更具性能和通用性,我也不了解如何制作简单的内容,例如使用and and''''''''在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等命令。这将使我可以创建"版本"的命令。并"尝试"(以及其他需要的话)。

因此,如果我可以使用参数同时启动"版本",我可能会以不同的方式使用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 Man页面上花费了大量小时后,我也找不到有关如何做到这一点的明确示例。

预先感谢您的时间和建议。

尽管SystemD确实没有提供通过单元文件的命令行参数的方法,但可以写 instances :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

所以,您可以像:

一样开始它
$ systemctl start serial-getty@ttyUSB0.service
$ systemctl start serial-getty@ttyUSB1.service

SystemD将启动不同的 serial-getty服务的实例

$ 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

也可以分别启用和禁用实例化服务。

当然,它缺乏命令行解析的大部分功能,但以通用方式用作某种配置文件选择。例如,您可以查看Fedora openvpn@.service:http://pkgs.fedoraproject.org/cgit/openvpn.git/tree/pree/openvpn@.service

直接尝试命令行参数是不可能的。

一种选择可能是环境变量(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和某些疗程服务。

最新更新