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.