何をやりたいか? †
- glassfish (JavaEEサーバ) から、LSF (IBMのクラウドJOB管理ミドル) に 科学計算JOB を投入するシステムを作りたい
- そのためには、glassfish が動いているプロセスに、LSF を実行するための環境変数を設定する必要がある
- → glassfish を起動するための systemd unit ファイルで環境変数ってどう設定すりゃいいんだっけ?
環境変数を設定しない systemd unit ファイル †
- /usr/lib/systemd/system/glassfish.service (編集前)
[Unit]
Description=GlassFish Server
After=network.target remote-fs.target
[Service]
Type=forking
PIDFile=/opt/glassfish4/glassfish/domains/domain1/config/pid
ExecStart=/opt/glassfish4/bin/asadmin start-domain
ExecReload=/opt/glassfish4/bin/asadmin restart-domain
ExecStop=/opt/glassfish4/bin/asadmin stop-domain
TimeoutStartSec=300
TimeoutStopSec=30
User=glassfish
[Install]
WantedBy=multi-user.target
[正解] EnvironmentFile? を使う †
[ダメ] ExecStartPre? では環境変数の設定はできない †
[Unit]
Description=GlassFish Server
After=network.target remote-fs.target
[Service]
Type=forking
PIDFile=/opt/glassfish4/glassfish/domains/domain1/config/pid
ExecStartPre=source /usr/share/lsf/conf/profile.lsf
ExecStart=/opt/glassfish4/bin/asadmin start-domain
ExecReload=/opt/glassfish4/bin/asadmin restart-domain
ExecStop=/opt/glassfish4/bin/asadmin stop-domain
TimeoutStartSec=300
TimeoutStopSec=30
User=glassfish
[Install]
WantedBy=multi-user.target
- ぢゃあかんの? → あきまへん
- ExecStartPre? は、/ ではじまるコマンドしか受け付けないので、source コマンドは実行できない
- というか source コマンドはシェルのビルトインコマンドなんで、シェルからうごいていないサービスで使えないのは当然
[注意] EnvironmentFile? 内では変数展開はされない †
- systemd unit ファイル内の EnvironmentFile? は、あくまで環境変数設定ファイルの読み込み
- 環境変数 は、KEY=VALUE 形式で定義する
- 環境変数中の ${} は展開されない
- /etc/sysconfig/glassfish (ダメパターン)
LSF_HOME=/usr/share/lsf
LSF_VERSION=10.0
MANPATH=${LSF_HOME}/${LSF_VERSION}/man:
LSF_SERVERDIR=${LSF_HOME}/${LSF_VERSION}/linux2.6-glibc2.3-x86_64/etc
LSF_LIBDIR=${LSF_HOME}/${LSF_VERSION}/linux2.6-glibc2.3-x86_64/lib
LD_LIBRARY_PATH=${LSF_HOME}/${LSF_VERSION}/linux2.6-glibc2.3-x86_64/lib
PATH=${LSF_HOME}/${LSF_VERSION}/linux2.6-glibc2.3-x86_64/etc:${LSF_HOME}/${LSF_VERSION}/linux2.6-glibc2.3-x86_64/bin:/sbin:/bin:/usr/sbin:/usr/bin
LSF_BINDIR=${LSF_HOME}/${LSF_VERSION}/linux2.6-glibc2.3-x86_64/bin
LSF_ENVDIR=${LSF_HOME}/conf
上記の "設定ファイル" を EnviromentFile? に設定すると、${LSF_HOME} や ${LSF_VERSION} が展開されずに、そのまま環境変数に設定される
Computer