서비스 파일의 aa 환경 문에서 Linux 명령을 실행합니다.

서비스 파일의 aa 환경 문에서 Linux 명령을 실행합니다.

이 파일이 있습니다 .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서비스 환경에 나타남을 의미합니다.ExecStartPreExecStart

유일하게 주목해야 할 점은 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.HOSTPORTEnvironmentFileExecStartPre

관련 정보