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>&12>&1 > file

答え2

私にとってこれはうまくいきます:

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

関連情報