systemd-내 서비스에 여러 인수 제공


44

시스템 서비스에 둘 이상의 인수를 제공 할 수 있습니까?

최종 사용자가 결정 해야하는 여러 인수가있는 프로그램을 실행하고 싶습니다.

예 : ./program arg1 arg2

단일 인수 앱을 시작하려면 systemctl start arg1@program서비스 정의에서 내가 가지고있는 것과 같은 것이 필요합니다 ExecStart = /usr/bin/program ℅i.

감사!


1
원하는 것은 구성 파일입니다.
Daniel B

이동 중에도 변경해야합니다. conf 파일이 꼭 필요합니까?
peperunas

@ peperunas conf 파일이 필요하지 않습니다. 추가 파일없이 작동하는 내 대답을 참조하십시오
nonagon

답변:


33

그래 넌 할수있어! 파일을 어딘가에 정의하고 시스템 EnvironmentFile서비스에 추가 하십시오. 예를 들어, /etc/.progconf의 내용은 다음과 같습니다.

ARG1=-o
ARG2=--verbose

그리고 .service 파일 :

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

이동 중에 파일을 변경해야하는 경우 해당 파일에 쓸 수 있습니다. 서비스는 옵션을 자주 변경해서는 안되며, 자동 시작 또는 cron을 고려해야 할 수도 있습니다.

더 많은 예제를 보려면 https://wiki.archlinux.org/index.php/Systemd/Services를 확인하십시오.


Heh는 매우 편리하다고 생각하지 않았습니다. 그래도 동의해야합니다. 서비스 매개 변수는 정기적으로 변경되지 않으며 구성 파일도 변경되지 않습니다.
Daniel B

서비스 파일이 환경 변수를 사용하는 경우 변수 VAR1=... VAR2=... systemctl start foobar.service를 전달할 수 있습니까?
Johannes Schaub-litb

예, 가능합니다
platforma

6
@ JohannesSchaub-litb, 아니, 당신은 할 수 없습니다. 거기 인 PassEnvironment지시자는 있지만에서 변수 소요 systemd되지에서 처리 (보통 PID 1) systemctl. systemctl프로세스의 환경 변수 는 시작되는 서비스로 전파되지 않습니다.
cjm

2
그러나 upstart는 다른 매개 변수를 사용하여 동일한 서비스의 여러 인스턴스를 실행할 수 있습니다. 예를 들어 eth0에있는 메일 서버와 eth1에있는 해당 메일 서버의 다른 인스턴스는 매개 변수를 upstart에 전달하고 별도의 서비스로 관리합니다. systemd가 이것을 할 수 있습니까?
LtWorf

15

나는 똑같은 일을하고 싶었지만 인수의 각 조합에 대해 별도의 파일이 없었습니다. 공백으로 하나의 긴 인수를 전달한 다음 systemd의 환경 변수 공간 분할 기능을 사용하여 인수를 분리 할 수 ​​있음을 발견했습니다.

파일 이름으로 서비스를 만들었습니다 argtest@.service( 서비스가 인수를 취할 때 필요한 'at sign'에주의하십시오 ).

[Unit]
Description=Test passing multiple arguments

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

나는 이것을 실행 sudo systemctl start argtest@"arg1 arg2 arg3".service하고 그것을 통과 arg1, arg2arg3test.py.에 별도의 명령 행 인수로


"후행 앰퍼샌드 참고": 답장에 앰퍼샌드가 없습니다. 이 시점에서 명확하게 답변을 편집 할 수 있습니까?
Patrick Mevzek

예, 죄송합니다.
nonagon

@는 당신이 % I를 사용할 때만 필요하다고 생각합니다. 서비스의 인스턴스입니다.
Toby

동의, 나는 그것을 생략 한 몇 개의 블로그 게시물에 부딪쳤다. 나는 대답을 명확히 할 것이다.
nonagon

이것은 다른 서비스에서 작동하지 않는 것 같습니다. 나는 시도 Wants=argtest@"arg1 arg2".service했고 첫 번째 논쟁 만 통과되었습니다.
Roger Dueck

1

내가 찾은 가장 쉬운 것은 :

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

모두 자체적으로 보관합니다.

나는 우분투 18.04 LTS에서 적어도 그렇게 할 필요가 없다는 것을 알았습니다.

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

$vars 이 패턴에 대한 논쟁으로도 활용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.