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!


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


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 argtest@.service( 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.


"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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.