systemd - Fornendo al mio servizio più argomenti


46

È possibile fornire al mio servizio systemd più di un argomento?

Vorrei eseguire un programma con più argomenti che devono essere decisi dall'utente finale.

Per esempio: ./program arg1 arg2

Per avviarla un'app a argomento singolo avrei bisogno di qualcosa di simile systemctl start arg1@program, dove nella definizione del servizio ho ExecStart = /usr/bin/program ℅i.

Grazie!


1
Sembra che quello che vuoi sia un file di configurazione.
Daniel B

Devo cambiarlo in viaggio. Ho assolutamente bisogno di un file conf?
peperunas,

@peperunas non hai bisogno di un file conf, vedi la mia risposta che funziona senza file extra
nonagon

Risposte:


36

Si, puoi! Definiscili in un file da qualche parte e aggiungili al EnvironmentFiletuo Systemd Service. Ad esempio, supponiamo che i contenuti di /etc/.progconf siano:

ARG1=-o
ARG2=--verbose

E il tuo file .service:

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

È possibile scrivere su quel file se è necessario modificarli in movimento. Un servizio non dovrebbe cambiare le sue opzioni molto spesso, forse prendere in considerazione l'avvio automatico o cron se è necessario farlo.

Per altri esempi controlla: https://wiki.archlinux.org/index.php/Systemd/Services


Heh, abbastanza utile, non ci ha pensato. Devo essere d'accordo però: i parametri di servizio non cambiano su base regolare, e nemmeno i loro file di configurazione.
Daniel B

se il file di servizio utilizza variabili di ambiente, puoi dire VAR1=... VAR2=... systemctl start foobar.servicedi passare le variabili?
Johannes Schaub - litb

Sì, credo che tu possa
platforma l'

6
@ JohannesSchaub-litb, no, non puoi. C'è una PassEnvironmentdirettiva, ma prende variabili dal systemdprocesso (normalmente PID 1), non da systemctl. Le variabili di ambiente dal systemctlprocesso non vengono propagate al servizio avviato.
cjm

2
Ma upstart può eseguire più istanze dello stesso servizio, con parametri diversi. Ad esempio un server di posta su eth0 e un'altra istanza di detto server di posta su eth1, passando il parametro a start up e gestendoli come servizi separati. Systemd può farlo?
Ten .orf

15

Volevo fare la stessa cosa, ma senza un file separato per ogni combinazione di argomenti. Ho scoperto che potevo passare un lungo argomento con spazi e quindi usare la funzione di suddivisione dello spazio variabile di ambiente di systemd per separare gli argomenti.

Ho creato un servizio con nome file argtest@.service( notare il trascinamento 'at sign' che è richiesto quando un servizio accetta argomenti ).

[Unit]
Description=Test passing multiple arguments

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

Eseguo questo con sudo systemctl start argtest@"arg1 arg2 arg3".servicee passa arg1, arg2e arg3come argomenti della riga di comando separati per test.py.


"nota la e commerciale finale": non trovo e commerciale nella tua risposta. Puoi modificare la tua risposta per essere più chiaro su questo punto?
Patrick Mevzek,

Sì, scusa per quello!
nonagon

Penso che @ sia necessario solo quando usi% I mentre lo fai. È un'istanza del servizio.
Toby,

D'accordo, mi sono appena imbattuto in alcuni post sul blog che lo hanno omesso. Chiarirò nella mia risposta.
nonagon,

Questo non sembra funzionare all'interno di un altro servizio. Ho provato Wants=argtest@"arg1 arg2".servicee solo il primo argomento è stato approvato.
Roger Dueck,

1

Il più semplice che ho trovato è:

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

Mantiene tutto autonomo.

Detto questo, ho scoperto che almeno su Ubuntu 18.04 LTS, non ho nemmeno bisogno di farlo, posso farlo e funziona benissimo:

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

$vars funziona anche come argomento con questo modello.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.