it-swarm.com.de

Wie verwende ich einen Parameter in der ExecStart-Befehlszeile?

Ich versuche, ein SysVintit-Skript, das unter Debian (und abgeleiteten Distributionen wie LinuxMint und Ubuntu & Co.) verwendet wird, in einen systemd-Dienst für Fedora oder ArchLinux (und abgeleitete Distributionen wie Bridge oder Manjaro) umzuwandeln, aber auch wenn das systemd start system ist performanter und vielseitiger als das vorherige, ich verstehe nicht, wie man einfache Dinge wie die Verwendung eines "optionalen" Arguments in einer Befehlszeile wie ExecStart = oder ExecRestart = macht!

Folgendes mache ich mit 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
:

Daher können im obigen Skript verschiedene Argumente verwendet werden, einschließlich eines leeren, das die Meldung "Usage: ..." anzeigt, wenn die folgenden Befehlszeilen verwendet werden:

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

Mit systemd sollte das Skript nun so aussehen:

[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

Hier fangen meine Probleme (und mein Mangel an Systemkenntnissen) an:

Offensichtlich stellt systemd keinen Befehl wie ExecCustom01 =, ExecCustom02 usw. zur Verfügung, mit dem ich Befehle für "version" und "try" (und andere, falls erforderlich) erstellen könnte.

Daher kann ich ExecRestart auf eine andere Art und Weise verwenden, wenn ich ein Argument verwenden könnte, um sowohl den Befehl "version" als auch den Befehl "try" zu starten (wobei gesagt wird, dass der "echte" Neustart durch sukzessives Starten der Befehle stop und start erfolgen kann ).

Dieser "angepasste" ExecRestart = -Befehl könnte dann so aussehen:

Sudo systemctl restart myprog  => without argument for the "try" command

und

Sudo systemctl restart myprog -v => for the "version" command

Das systemd-Skript könnte dann so aussehen:

[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

Aber ich weiß nicht, ob es möglich ist, und wenn ja, welche Syntax ist zu verwenden?

Jede Hilfe wäre sehr dankbar, da ich selbst nach ein paar Stunden in den Manpages für mehrere Systeme keine explizite Anleitung finden konnte.

TIA für Ihre Zeit und Beratung.

15
Fnux

Obwohl systemd in der Tat keine Möglichkeit bietet, Befehlszeilenargumente für Unit-Dateien zu übergeben, gibt es Möglichkeiten, Instanzen zu schreiben: http://0pointer.de/blog/projects/instances.html

Zum Beispiel: /lib/systemd/system/[email protected] sieht ungefähr so ​​aus:

[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

Sie können es also wie folgt starten:

$ systemctl start [email protected]
$ systemctl start [email protected]

Für systemd gibt es verschiedene Instanzen :

$ 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

Dies bedeutet auch eine großartige Möglichkeit, es separat zu aktivieren und zu deaktivieren.

Natürlich hat es nicht viel Power beim Kommandozeilen-Parsing, aber es wird üblicherweise als eine Art Auswahl von Konfigurationsdateien verwendet. Sie können sich beispielsweise Fedora openvpn @ .service ansehen: http://pkgs.fedoraproject.org/cgit/openvpn.git/tree/[email protected]

22
Hubbitus

Ein direkter Versuch von Kommandozeilenargumenten ist nicht möglich.

Eine Alternative könnten Umgebungsvariablen sein ( https://superuser.com/questions/728951/systemd-giving-my-service-multiple-arguments ).

Hier habe ich die Antwort gefunden: http://www.freedesktop.org/software/systemd/man/systemctl.html

so Sudo systemctl restart myprog -v - systemctl wird denken, dass Sie versuchen, eines seiner Flags zu setzen, nicht das Flag von myprog.

Sudo systemctl restart myprog someotheroption - systemctl startet myprog und den Dienst someotheroption neu, falls vorhanden.

2
Juan