2017-12-01 5 views
1

私は、起動時にPythonスクリプトを実行するRaspberry Piの簡単なサービスを持っています。 export OPSESPORT=XXXXを実行してenv変数を設定しました。これは、サービスファイルです:KeyError:linuxサービスによって実行される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でサービスを開始すると、スクリプトを実行するので、それはキーにアクセスすることはできませんので超奇妙です。参考までに、私はPython 2.7.13をRaspbian GNU/Linux 9(ストレッチ)で使用しています。

+1

を追加してみてください。環境変数の代わりにパラメタを使うことをお勧めします。それは可能ですか? – geckos

答えて

2

sudoを使用すると、同じenv変数は使用されません。スーパーユーザ権限なしでsystemctl start name.serviceを実行できますか?

編集:あなたはそれがあなたのシェルの環境を継承していないsystemdに別のシェルを介してサービスを実行すると
[Service] Enviroment="OPSESPORT=XXX"

+0

sudoを実行していない状態で実行していますが、サービスを追加する環境が機能しました。サービスファイルをgithubにプッシュしたいが、プライベートなものがenvキーに格納されている場合は、これが問題になるようです。 – ITried

+0

sudoのマニュアル: '-E、--preserve-env'。このフラグを使って元のスクリプトを実行してみてください。 –

+0

どのコマンドに追加しますか? 'sudo -E systemctl start name.service'を試しました。また、サービスファイル内のExecStartに-Eを追加してみました。どちらもうまくいかなかった。 – ITried

関連する問題