2017-12-01 21 views
1

그래서 나는 부팅시 파이썬 스크립트를 실행하는 라즈베리 파이에 간단한 서비스를 제공합니다. 또한 export OPSESPORT=XXXX을 실행하여 env 변수를 설정했습니다. KeyError : 리눅스 서비스에 의해 실행 된 Python 스크립트가 환경 변수에 접근 할 수 없습니다. var

[Unit] 
Description=My desc 
After=multi-user.target 

[Service] 
Type=simple 
User=pi 
ExecStart=/usr/bin/python /home/pi/path/to/file/somefile.py 
Restart=on-failure 

[Install] 
WantedBy=multi-user.target 

그리고 somefile.py에서

, 내가 가진 :이 서비스 파일입니다

서비스의 로그를 검사 할 때 다음과 같은 오류로 연결
import os 
PORT = int(os.environ['OPSESPORT']) 
#other code 

:

Traceback (most recent call last): 
    File line 141, in <module> 
    main() 
    File line 83, in main 
    PORT = int(os.environ['OPSESPORT']) 
    File in __getitem__ 
    raise KeyError(key) 
KeyError: 'OPSESPORT' 

이를 나는 스크립트를 실행하면 python somefile.py, 그때 그것은 잘 작동하지만 이후 스크립트가 실행되는 sudo systemctl start name.service으로 서비스를 시작하면 매우 이상합니다. 따라서 키를 액세스 할 수 없습니다. 참고로, 나는 Raspbian GNU/Linux 9 (stretch)에서 Python 2.7.13을 사용하고 있습니다.

+1

추가하십시오. 환경 변수 대신에 paraments를 사용할 것을 제안합니다. 그게 가능하니? – geckos

답변

2

sudo를 사용할 때 동일한 env 변수를 사용하지 않습니다. 수퍼 유저 권한없이 systemctl start name.service를 실행할 수 있습니까?

편집 :이 쉘 환경 당신을 상속하지 않는 다른 쉘을 systemd를 통해이 서비스를 실행하면
[Service] Enviroment="OPSESPORT=XXX"

+0

sudo를하지 않고 실행했지만 서비스를 추가하는 환경이 작동했습니다. 이것은 github에 서비스 파일을 푸시하려고하지만 env 키에 private 파일이 저장되어있는 경우 문제가되는 것 같습니다. – ITried

+0

sudo 매뉴얼에서 :'-E, --preserve-env'. 이 플래그를 사용하여 원본 스크립트를 실행 해보십시오. –

+0

내가 추가 할 명령은 무엇입니까? 나는'sudo -E systemctl start name.service'를 시도했다. 또한 서비스 파일 내에서 ExecStart에 -E를 추가하려고 시도했습니다. 어느 쪽도 효과가 없었다. – ITried