3.4. Software Collections でのサービス管理

Software Collection のパッケージ化を行う際、ユーザーは、Red Hat Enterprise Linux 6 の servicechkconfig、Red Hat Enterprise Linux 7 の systemctl などの Software Collection が提供するサービス (daemon)、またはシステムデフォルトツールを使用した関連アプリケーションの 1 つを直接管理できます。
Red Hat Enterprise Linux 6 の Software Collections では、以下のように spec ファイルの %install セクションを調整して、Software Collection に含まれるサービスのシステムバージョンと名前が競合しないようにします。
%install
install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{?scl:%_root_sysconfdir}%{!?scl:%_sysconfdir}/rc.d/init.d/%{?scl_prefix}service_name
service_name を、サービスの実際の名前に置き換えます。
Red Hat Enterprise Linux 7 の Software Collections では、以下のように spec ファイルの %install セクションを調整します。
%install
install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_unitdir}/%{?scl_prefix}service_name.service
この設定が導入されると、以下のように Software Collection に含まれるサービスのバージョンを参照できます。
%{?scl_prefix}service_name
ユーザーの環境から SysV init スクリプト (または Red Hat Enterprise Linux 7 の systemd サービスファイル) に環境変数が伝播されることはありません。これは想定されており、サービスが常にクリーンな環境で起動されるようにします。ただし、SysV init スクリプト (または systemd サービスファイル) で実行するプロセスの Software Collection 環境を適切に設定する必要があります。

3.4.1. サービス環境の設定

サービスに対して有効にする Software Collection を設定することが推奨されます。本セクションの方向は、software_collection という名前の Software Collection を設定可能にする方法を説明します。

手順3.2 Red Hat Enterprise Linux 6 でサービス用の環境の設定

  1. 以下の内容で、/opt/provider/software_collection/service-environment に設定ファイルを作成します。
    [SCLNAME]_SCLS_ENABLED="software_collection"
    SCLNAME を、(大文字で書かれた) Software Collection の名前の一意の識別子に置き換えます。
    software_collection を、 %scl_name マクロで定義した Software Collection の名前に置き換えます。
  2. SysV init スクリプトの最初に以下の行を追加します。
    source /opt/provider/software_collection/service-environment
  3. SysV init スクリプトで、/opt/provider/ ファイルシステム階層にあるバイナリーを実行するコマンドを決定します。これらのコマンドの前に scl enable $[SCLNAME]_SCLS_ENABLED (Software Collection 環境でコマンドを実行する場合と同様) を指定してください。
    たとえば、以下の行を置き換えます。
    /usr/bin/daemon_binary --argument-1 --argument-2
    上記の行を、以下のように置き換えます。
    scl enable $[SCLNAME]_SCLS_ENABLED -- /usr/bin/daemon_binary --argument-1 --argument-2
  4. surunuser などの一部のコマンドは、環境変数をクリアします。したがって、これらのコマンドが SysV init スクリプトで使用されている場合は、このコマンドの実行後に Software Collection を再度有効にします。
    たとえば、以下の行を置き換えます。
    su - user_name -c '/usr/bin/daemon_binary --argument-1 --argument-2'
    上のコマンドを、下のコマンドに置き換えます。
    su - user_name -c '\
      source /opt/provider/software_collection/service-environment \
      scl enable $SCLNAME_SCLS_ENABLED -- /usr/bin/daemon_binary --argument-1 --argument-2'

手順3.3 Red Hat Enterprise Linux 7 でサービス用の環境の設定

  1. 以下の内容で、/opt/provider/software_collection/service-environment に設定ファイルを作成します。
    [SCLNAME]_SCLS_ENABLED="software_collection"
    SCLNAME を、(大文字で書かれた) Software Collection の名前の一意の識別子に置き換えます。
    software_collection を、 %scl_name マクロで定義した Software Collection の名前に置き換えます。
  2. systemd サービスファイルに以下の行を追加して、設定ファイルを読み込みます。
    EnvironmentFile=/opt/provider/software_collection/service-environment
  3. systemd サービスファイルでは、Software Collection 環境でコマンドを実行するときと同様に、ExecStartPreExecStart、および同様のディレクティブで指定されたすべてのコマンドの前に scl enable $[SCLNAME]_SCLS_ENABLED を付けてください。
    ExecStartPre=/usr/bin/scl enable $[SCLNAME]_SCLS_ENABLED -- /opt/provider/software_collection/root/usr/bin/daemon_helper_binary --argument-1 --argument-2
    ExecStart=/usr/bin/scl enable $[SCLNAME]_SCLS_ENABLED -- /opt/provider/software_collection/root/usr/bin/daemon_binary --argument-1 --argument-2
警告
ExecStart* コマンドの前に scl enable ... を使用すると、サービスが、SELinux ポリシーで示されるターゲットの SELinux コンテキストに移行できなくなります。SELinux を使用してこのサービスを制限する場合は、systemd サービスファイルでバイナリーを直接実行する必要があります。バイナリーが Software Collection に含まれる共有ライブラリーにリンクされている場合、DT_RUNPATH 属性は scl enable ... ラッパーを使用せずに、ランタイム時にこれらの共有ライブラリーにアクセスできるようにするのに役立ちます。詳細は、「Red Hat Enterprise Linux 7 での SELinux サポート」 を参照してください。