環境ファイルを設定するためにCommandoソースを使用する必要があるアプリケーションがあります。
[Unit]
Description=Programname
After=syslog.target network.target
[Service]
User=root
ExecStartPre=source /opt/environmentname/bin/activate enviromentname
ExecStart=/var/programname/programname -f /etc/programname/programconfig.conf
[Install]
WantedBy=multi-user.target
Systemdは絶対パスではなく、ソースがbash組み込みであるため、ソースについて文句を言います。
ExecStartPre=/bin/bash -c "source /opt/environmentname/bin/activate enviromentname"
ベンダーの要件のため、chmod +xの代わりにソースを使用してスクリプトを実行します。
では、動作させる方法はありますか?それともフォークのようなものを使うべきですか?
Systemdユニットファイルでbash組み込みコマンドを正しく使用するにはどうすればよいですか?
答え1
次のような複数行スクリプトを実行できる必要があります。
ExecStart=/bin/bash -c '\
source /opt/environmentname/bin/activate environmentname; \
exec /var/programname/programname -f /etc/programname/programconfig.conf'
答え2
これを理解するには…ExecStart
コマンドで設定された環境によって異なりますか?これらの行は実際には同じシェルで実行されないため、環境を共有することは期待できません。必要なのは、Environment
ユニットファイルでキーワードを使用することです。これにより、ExecStart
ファイルで定義された環境を取得できます。
https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html