이 파일이 있습니다 .service
. ExecStart
환경에서 변수로 설정할 수 있다고 생각되는 일부 매개변수를 전달해야 합니다. 하지만 먼저 a 및 가 있는 파일에서 해당 매개변수 를 .conf
가져와야 grep
합니다 cut
.
하지만 파일에서 값을 얻을 수 있도록 환경에서 Linux 명령문을 실행할 수 있는지 알아야 합니다 .conf
.
Environment=(here would be the code for the variables)
ExecStart=(here i would use them)
답변1
기존 항목을 수정 EnvironmentFile
하고 ExecStartPre
다음에서 적용할 수 있습니다 ExecStart
.
~/.config/systemd/user/envtest.service
:
[Unit]
Desciption=Test EnvironmentFile usage
[Service]
Type=oneshot
#
# An environment file can be used to set a bunch of variables
# %t is a runtime directory, The location is arbitary so use what
# works for you.
EnvironmentFile=%t/envtest.environment
#
# We will edit the environment file from this bash script.
# The file itself is passed as an argument into the script.
# This line will fail to start if the EnvironmentFile doesn't
# exist yet. So it might be better to have a permanent file
# somewhere such as `/var/lib`.
ExecStartPre=%h/bin/create_environment.sh %t/envtest.environment
#
# The environment file will be re-read and applied to the service
# I am using simply using `env` to print out the current environment
# so we can see whether the contents of our EnvironmentFile are used
ExecStart=/usr/bin/env
~/bin/create_environment.sh
:
#!/bin/bash
# Add your `grep *.conf | cut > $1` here
# This variable is for demonstration
echo "TestVariable=Added" > $1
EnvironmentFile=
이 명령을 실행하면 명령이 존재하지 않는 경우 실패함을 나타냅니다. 그러나 먼저 파일을 생성하면(아마도 /var
시작 사이에 지속되는 위치에 파일이 있도록 하려는 경우) 서비스를 시작할 수 있습니다.
$ systemctl --user start envtest.service
...
Feb 12 14:47:59 stewbian systemd[992]: envtest.service: Failed to load environment files: No such file or directory
Feb 12 14:47:59 stewbian systemd[992]: envtest.service: Failed to run 'start-pre' task: No such file or directory
$ touch /run/user/$UID/envtest.environment
$ systemctl --user start envtest.service
$ journalctl --user -u evntest.service | grep TestVariable
Feb 12 14:49:10 stewbian envtest[261219]: TestVariable=Added
journalctl
서비스에서 인쇄한 출력에서 이를 확인할 수 있습니다 TestVariable=Added
. 이는 파일에 대한 변경 사항이 EnvironmentVariable
서비스 환경에 나타남을 의미합니다.ExecStartPre
ExecStart
유일하게 주목해야 할 점은 EnvironmentFile
서비스가 실행되기 전에 존재해야 한다는 것입니다(그러므로 아마도 저처럼 %T
/ /tmp
또는 /를 사용하지 마세요).%t
/run
OP의 의견을 기반으로 업데이트: 에서 변수를 설정하면 EnvironmentVariable
응용 프로그램이 환경 변수를 읽으려고 할 때 환경 변수에 액세스할 수 있습니다(예:환경 가져오기(3)). 귀하의 의견에서는 다음과 같이 명령줄 호출에서도 변수를 사용할 것을 제안했습니다.
ExecStart=/path/to/bin/app --host=$HOST --port=$PORT
bash
사람들은 종종 에 구문을 추가하는 실수를 ExecStart
저지르지만 운 좋게도환경변수 교체지원되는 몇 안 되는 쉘 스타일 기능 중 하나입니다. 단일 단어로 사용되면 $PORT
대체됩니다. 위의 예에서는 ${PORT}
변수가 단어의 일부인 경우에도 이를 더 명시적으로 사용해야 합니다. 데모는 다음과 같습니다.
$ cat ~/bin/create_environment.sh
#!/bin/bash
echo "HOST=127.0.0.1" > $1
echo "PORT=11111" >> $1
$ systemctl --user cat envtest.service
# /home/stew/.config/systemd/user/envtest.service
[Service]
Type=oneshot
EnvironmentFile=%t/envtest.environment
ExecStartPre=%h/bin/create_environment.sh %t/envtest.environment
ExecStart=/bin/echo --host=${HOST} --port=${PORT}
$ touch /run/user/$UID/envtest.environment
$ systemctl --user start envtest.service
$ journalctl --user -u envtest.service | grep echo
Feb 12 21:28:00 stewbian echo[268399]: --host=127.0.0.1 --port=11111
에서 설정한 스크립트에 의해 및 의 값이 올바르게 인쇄되는 것을 확인할 수 있습니다 echo
.HOST
PORT
EnvironmentFile
ExecStartPre