Comment utiliser un paramètre dans ExecStart ligne de commande?

J'essaie de convertir un SysVintit script utilisé sur Debian (et ses dérivés distributions telles que LinuxMint et Ubuntu & Co.) pour un service systemd pour être utilisé sur Fedora ou ArchLinux (et dérivés distributions de tel qu'un Pont ou Manjaro), mais même si l'systemd démarrer le système est plus performant et polyvalent que le précédent, je ne comprends pas comment faire des choses simples telles que l'utilisation d'une "option" argument sur une ligne de commande comme ExecStart= ou ExecRestart= !

Voici ce que je fais avec 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
:

Ainsi, le script ci-dessus permet d'utiliser des arguments différents, y compris un vide qui va afficher le message "Usage: ..." lors de l'utilisation de lignes de commande suivantes:

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

Maintenant, avec systemd, le script devrait ressembler à ceci :

[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

Ici commence mes problèmes (et mon manque de systemd connaissances):

Évidemment, systemd n'est pas de fournir une commande telle que ExecCustom01=, ExecCustom02, etc. qui me permettrait de créer des commandes pour la "version" et "essayer" (et d'autres si nécessaire).

Donc, je peux utiliser ExecRestart dans un autre maner si je pouvais utiliser un argument de départ, les deux à la "version" ou "essayer" de commande (en cours, a déclaré que le "vrai" redémarrage peut être fait en commençant successivement les arrêter et les commandes de démarrage).

Ces "sur-mesure" ExecRestart= commande pourrait alors ressembler à ceci:

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

et

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

L'systemd script pourrait alors ressembler à ceci:

[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

Mais je ne sais pas si c'est possible, et si oui, quelle est la syntaxe à utiliser!

Toute aide serait vraiment appréciée car même après avoir passé un tas d'heures de multiple de systemd homme pages, je ne pouvais pas trouver n'importe quel échantillon explicites sur la façon de le faire.

TIA pour votre temps et vos conseils.

Si /opt/mystuff/myprog est un binaire exécutable puis juste donc il est appelé. Sinon: ExecStart=/bin/sh -c '/opt/mystuf/myprog -r'
Pourquoi systemd besoin d'appeler version ou try?
Sergy Kanaev, je m'attendais à une semblable manière d'utiliser le "service" que je peux le faire simplement avec sysVinit script sans être obligé d'entrer complexe de lignes de commande. @nuclearPeon, Q: Pourquoi systemd besoin d'appeler "version" ou "essayer" options? R: tout Simplement parce que je veux le faire et, évidemment, je le fais avec le sysVinit exemple de script que j'ai fournis.
Ce cas d'utilisation est là pour un utilisateur d'appeler pour la version d'un service? Même si je ne suis pas en désaccord avec la commodité d'un développeur d'avoir accès à un service de commande version, systemd est de rendre les services presque auto-gérer le une fois créé. Je ne vois vraiment pas besoin d'une version de la commande. Si vous voulez vraiment, vous pouvez ajouter la version en [Unit]'s Description=... option afin de l'appelant systemctl status myservice serait de retour This script manages myprog: v.0.90.a ou quelle que soit la chaîne de version que vous avez.
Les gens ne sont pas attendre pour obtenir la version en appelant service. (Et s'ils le font, ils ont été très mal conçu le système d'exploitation ou autrement appris de très mauvaises habitudes.) Ils s'attendent à exécuter quelque chose comme myprog --version ou myprog -V directement. Donc il n'y a pas besoin de cela. Et le try verbe n'a pas de sens. Faire ou ne pas faire; il n'y a pas d'essai. Il y a moyens de préserver ces vieux verbes si vraiment nécessaire, mais dans ce cas, ils ne semblent pas être nécessaires.

OriginalL'auteur Fnux | 2014-02-01