systemd 서비스 파일의 sh 스크립트에서 환경 변수 설정

systemd 서비스 파일의 sh 스크립트에서 환경 변수 설정

저는 이미 만들어진 bash 스크립트를 사용하여 env를 설정하려고 합니다. 제가 사용하려고 하는 서비스는 다음과 같습니다.

[Unit]
Description=myserver service
After=multi-user.target

[Service]
Type=simple
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/ec2-user/myserver/
ExecStart=/bin/sh -c '/home/ec2-user/myserver/config/myserverVars.sh ;/home/ec2-user/venv/bin/python  /home/ec2-user/myserver/myserver.py 2>&1 >> /home/ec2-user/myserver/logs/systemd_myserver.log' 
StandardOutput=append:/home/ec2-user/myserver/logs/systemd_stdout.log
StandardError=append:/home/ec2-user/myserver/logs/systemd_stderr.log

[Install]
WantedBy=multi-user.target

이것 myserverVars.sh:

#!/bin/bash
export [email protected]
export APP2_BIND_PASS=xxxxxx
export APP3=xxxxxx

의 변수는 /home/ec2-user/myserver/config/myserverVars.sh
설정되지 않으며 서버는 변수 없이 시작되는데, 이는 오류입니다. 환경 키나 환경 파일을 사용하지 않으려고 합니다.

답변1

스크립트 파일에 정의된 변수를 스크립트를 실행하는 상위 환경에서 사용할 수 있게 하려면 다음이 필요합니다.원천스크립트를 실행하는 대신 줄 ExecStart을 다음으로 변경하십시오.

ExecStart=/bin/sh -c '. /home/ec2-user/myserver/config/myserverVars.sh ;/home/ec2-user/venv/bin/python  /home/ec2-user/myserver/myserver.py >> /home/ec2-user/myserver/logs/systemd_myserver.log 2>&1 ' 

바라보다소싱("." 또는 "source")과 bash에서 파일 실행의 차이점은 무엇입니까?스크립트 가져오기와 스크립트 실행 간의 차이점에 대한 자세한 내용입니다.

또한 리디렉션 순서를 변경했습니다. stderr과 stdout을 동일한 파일로 가져 > file 2>&1오려면 2>&1 > file.

답변2

나에게 이것은 작동합니다 :

 ExecStart=/bin/bash -c 'MYVAR=xx exec /some/file'

관련 정보