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.
/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
Vous devez vous connecter pour publier un commentaire.
Bien que systemd, en effet, ne fournit pas de moyen de passer des arguments de ligne de commande pour l'unité de fichiers, il y a des possibilités d'écriture: http://0pointer.de/blog/projects/instances.html
Par exemple:
/lib/systemd/system/[email protected]
ressemble à quelque chose comme ceci:Ainsi, vous pouvez commencer comme:
Pour systemd, il sera différent instances:
Il a également une plus grande possibilité d'activer et de désactiver séparément.
Bien sûr, il manque beaucoup de puissance de la ligne de commande de l'analyse, mais dans la commune de la manière dont il est utilisé comme une sorte de config de sélection de fichiers. Par exemple, vous pouvez regarder Fedora [email protected]: http://pkgs.fedoraproject.org/cgit/openvpn.git/tree/[email protected]
%I
et%i
substitutions, voir la Prescripteurs section deman 5 systemd.unit
ou systemd.unité.J'aime particulièrement cet exemple parce que je l'ai trouvé en la création d'un service pour enregistrer l'activité de port série. 🙂
Les arguments optionnels? Comment la série-getty service de démarrage lors du démarrage du système?
Commence pas un modèle, mais des cas! Donc, si vous (programme d'installation) ne
systemctl enable serial-getty@ttyUSB0
, puis il service sera exécuté sur démarrer.OriginalL'auteur Hubbitus
Pour tenter arguments de ligne de commande directement n'est pas possible.
Une autre solution pourrait être variables d'environnement (https://superuser.com/questions/728951/systemd-giving-my-service-multiple-arguments).
C'est là que j'ai trouvé la réponse:
http://www.freedesktop.org/software/systemd/man/systemctl.html
donc
sudo systemctl restart myprog -v
-- systemctl vont penser que vous êtes en essayant de mettre l'un de ses drapeaux, pas myprog du drapeau.sudo systemctl restart myprog someotheroption
-- systemctl va redémarrer myprog et la someotheroption service, si elle existe.Si pulseaudio ne peut pas le faire, personne ne le peut!!!
OriginalL'auteur Juan