systemd - Donner à mon service plusieurs arguments

46

Est-il possible de donner à mon service systemd plus d'un argument?

Je voudrais exécuter un programme avec plusieurs arguments qui doivent être décidés par l'utilisateur final.

Par exemple: ./program arg1 arg2

Pour démarrer une application à un seul argument, il me faudrait quelque chose du type systemctl start arg1@programoù figure la définition du service ExecStart = /usr/bin/program ℅i.

Merci!

peperunas
la source
1
On dirait que ce que vous voulez est un fichier de configuration.
Daniel B
Je dois le changer sur le pouce. Ai-je strictement besoin d'un fichier de configuration?
peperunas
@peperunas vous n'avez pas besoin d'un fichier de configuration, voir ma réponse qui fonctionne sans aucun fichier supplémentaire
nonagon

Réponses:

36

Oui, vous pouvez! Définissez-les dans un fichier quelque part et ajoutez-les à EnvironmentFilevotre service systemd. Par exemple, supposons que le contenu de /etc/.progconf soit:

ARG1=-o
ARG2=--verbose

Et votre fichier .service:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2

Vous pouvez écrire dans ce fichier si vous devez les modifier en tout temps. Un service ne devrait pas changer très souvent ses options, peut-être envisager le démarrage automatique ou cron si vous avez besoin d'y parvenir.

Pour plus d'exemples, consultez: https://wiki.archlinux.org/index.php/Systemd/Services

plate-forme
la source
Heh, assez pratique, n'y a pas pensé. Je dois cependant convenir: les paramètres de service ne changent pas régulièrement, pas plus que leurs fichiers de configuration.
Daniel B
si le fichier de service utilise des variables d’environnement, pouvez-vous dire VAR1=... VAR2=... systemctl start foobar.servicede les transmettre?
Johannes Schaub - lundi
Oui, je crois que vous le pouvez
plateforme le
6
@ JohannesSchaub-litb, non, vous ne pouvez pas. Il existe une PassEnvironmentdirective, mais elle prend des variables du systemdprocessus (normalement le PID 1), pas de systemctl. Les variables d'environnement du systemctlprocessus ne sont pas propagées au service en cours de démarrage.
cjm
2
Mais Upstart peut exécuter plusieurs instances du même service, avec des paramètres différents. Par exemple, un serveur de messagerie sur eth0 et une autre instance dudit serveur de messagerie sur eth1 transmettent le paramètre à upstart et les gèrent en tant que services distincts. Systemd peut-il le faire?
LtWorf
15

Je voulais faire la même chose, mais sans fichier séparé pour chaque combinaison d'arguments. J'ai découvert que je pouvais passer un long argument avec des espaces, puis utiliser la fonctionnalité de division d'espace variable d'environnement de Systemd pour séparer les arguments.

J'ai rendu un service avec le nom de fichier [email protected]( notez le signe 'au signe' qui est requis lorsqu'un service prend des arguments ).

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS

Je lance ceci avec sudo systemctl start argtest@"arg1 arg2 arg3".serviceet il passe arg1, arg2et arg3comme arguments de ligne de commande séparés à test.py.

nonagone
la source
"notez l'esperluette de fuite": je ne trouve aucune esperluette dans votre réponse. Pouvez-vous modifier votre réponse pour qu'elle soit plus claire sur ce point?
Patrick Mevzek
Oui, désolé pour ça!
nonagone
Je pense que le @ n'est nécessaire que lorsque vous utilisez le% I comme vous le faites. C'est une instance du service.
Toby
D'accord, je viens de tomber sur quelques articles de blog qui l'ont omis. Je vais clarifier dans ma réponse.
nonagone
Cela ne semble pas fonctionner à l'intérieur d'un autre service. J'ai essayé Wants=argtest@"arg1 arg2".serviceet seul le premier argument a été passé.
Roger Dueck
1

Le plus facile que j'ai trouvé est:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""

Garde le tout autonome.

Cela dit, j'ai constaté qu'au moins sur Ubuntu 18.04 LTS, je n'ai même pas besoin de le faire, je peux le faire et cela fonctionne bien:

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"

$vars travailler comme arguments avec ce motif aussi.

jjxtra
la source