システム化されたbash組み込み機能

システム化されたbash組み込み機能

環境ファイルを設定するために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

関連情報