systemd - Fornecendo ao meu serviço vários argumentos

44

É possível dar ao meu serviço systemd mais de um argumento?

Eu gostaria de executar um programa com vários argumentos que precisam ser decididos pelo usuário final.

Por exemplo: ./program arg1 arg2

Para iniciar um aplicativo de argumento único, eu precisaria de algo como systemctl start arg1@program, onde na definição de serviço que tenho ExecStart = /usr/bin/program ℅i.

Obrigado!

peperunas
fonte
11
Parece que o que você quer é um arquivo de configuração.
Daniel B
Eu preciso mudar isso em qualquer lugar. Preciso estritamente de um arquivo conf?
Peperunas
@peperunas você não precisa de um arquivo conf, veja a minha resposta que funciona sem quaisquer arquivos extras
nonagon

Respostas:

34

Sim você pode! Defina-os em um arquivo em algum lugar e adicione-os ao EnvironmentFileseu serviço systemd. Por exemplo, digamos que o conteúdo do /etc/.progconf seja:

ARG1=-o
ARG2=--verbose

E seu arquivo .service:

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

Você pode gravar nesse arquivo se precisar alterá-los em movimento. Um serviço não deve alterar suas opções com muita frequência, talvez considere iniciar automaticamente ou cron se você precisar fazer isso.

Para mais exemplos, verifique: https://wiki.archlinux.org/index.php/Systemd/Services

platforma
fonte
Heh, bastante útil, não pensou nisso. Tenho que concordar: os parâmetros de serviço não são alterados regularmente e os arquivos de configuração também.
Daniel B #
se o arquivo de serviço usa variáveis ​​de ambiente, você pode dizer VAR1=... VAR2=... systemctl start foobar.servicepara passar as variáveis?
Johannes Schaub - litb
Sim, eu acredito que você pode
platforma
6
@ JohannesSchaub-litb, não, você não pode. Existe uma PassEnvironmentdiretiva, mas recebe variáveis ​​do systemdprocesso (normalmente PID 1), não de systemctl. As variáveis ​​de ambiente do systemctlprocesso não são propagadas para o serviço que está sendo iniciado.
Cjm 31/03/16
2
Mas o iniciante pode executar várias instâncias do mesmo serviço, com parâmetros diferentes. Por exemplo, um servidor de correio em eth0 e outra instância do referido servidor de correio em eth1, passando o parâmetro para iniciar e gerenciando-os como serviços separados. O systemd pode fazer isso?
LtWorf
15

Eu queria fazer a mesma coisa, mas sem um arquivo separado para cada combinação de argumentos. Descobri que podia passar um longo argumento com espaços e depois usar o recurso de divisão de espaço da variável de ambiente do systemd para separar os argumentos.

Eu fiz um serviço com nome de arquivo [email protected]( observe o sinal de arroba à direita, necessário quando um serviço recebe argumentos ).

[Unit]
Description=Test passing multiple arguments

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

Eu corro isso com sudo systemctl start argtest@"arg1 arg2 arg3".servicee ele passa arg1, arg2e arg3como argumentos separados da linha de comando para test.py.

nonagon
fonte
"observe o e comercial final": não encontro e comercial na sua resposta. Você pode editar sua resposta para ficar mais claro neste ponto?
Patrick Mevzek 04/04
Sim, desculpe por isso!
Nonagon
Eu acho que o @ só é necessário quando você usa o% I como você. É uma instância do serviço.
Toby
Concordo, acabei de encontrar algumas postagens no blog que o omitiram. Vou esclarecer na minha resposta.
Nonagon 9/04
Isso parece não funcionar em outro serviço. Eu tentei Wants=argtest@"arg1 arg2".servicee apenas o primeiro argumento foi aprovado.
Roger Dueck 18/06
1

O mais fácil que encontrei é:

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

Mantém tudo independente.

Dito isto, descobri que pelo menos no Ubuntu 18.04 LTS, nem preciso fazer isso, posso fazer isso e funciona bem:

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

$vars trabalhe como argumentos com esse padrão também.

jjxtra
fonte