NO IMAGE

【Linux】プロセス起動順序を制御する

NO IMAGE

ここではLinuxのプロセス起動順序を制御する方法を紹介します。説明にあたって、まずは基本となるsystemd, systemctlコマンドから紹介したいと思います。

systemdとは

systemdは、Linuxカーネルによって最初に起動されるプロセスです。プロセスIDは1になります。

Linuxではメモリ上に常駐し、バックグラウンドで処理要求を待ち続けるプログラムを「デーモン」と呼びますが、このsystemdは「すべてのサービス、デーモンの起動などを管理するプログラム」です。いわばデーモンのグレートマザーです。

systemdは

  • /lib/systemd/system/
  • /etc/systemd/system/

の2箇所に、それぞれのサービス(unitと呼ばれます)の設定を記述したファイルが置かれています。/lib以下がLinuxによって保存される場所であり、ここのファイルを自分で上書きしたり、自作のunit設定ファイルを追加する際に/etc以下の方を使います。

 systemctl

systemctlコマンドはこのsystemdを制御するためのコマンドです。つまり、systemctlによってサービス状態の確認、起動/停止、自動起動の設定などが行えます

それぞれのコマンド詳細についてはこちらが詳しいです。ここでは冒頭にも言った通り「サービスの起動順序の制御」に絞って紹介したいと思います。

 サービス起動順を制御する

Webサービスなどを運用していて、「プロセスBの後にプロセスAが起動するとエラーになる」といったケースに遭遇したとしましょう。対応として、プロセスA→プロセスBの順番に起動する、という設定をしたい訳です。

まず、現状プロセスの起動順がどうなっているか確認します。

$ systemctl list-dependenciesdefault.target● ├─apport.service● ├─display-manager.service● ├─google-fluentd.service● ├─grub-common.service● ├─systemd-update-utmp-runlevel.service● └─multi-user.target●├─process-a.service●├─process-b.service

systemctl list-dependenciesコマンドは、プロセス同士がどのような順序で起動するようになっているかをツリー形式で表示します。ここではprocess-a.serviceとproccess-b.serviceが同列になっており、これは「どちらが先に起動完了するかは保証できない」ことを意味しています。

ここから、起動順を設定していきます。/etc/systemd/system/process-a.serviceを開き、編集していきます(ファイルがない場合は作成します)。

[Unit]Description=Service AAfter=network.targetBefore=process-b.service[Service]Type=simpleRestart=always...

ここでは[Unit]に定義したBefore=process-b.serviceに注目です。これは「process-b.serviceの起動前に、process-a.serviceの起動を完了しといてね」という意味の設定で、これによってプロセスA→プロセスBの起動順を保証できます。