Systemdで自動実行する

Systemdはinitと違い、処理を分割して並列化することでシステム起動処理を高速化することができる。 Systemdの各Unitの設定ファイルは、/usr/lib/systemd/system/と/etc/systemd/system/以下にあり、両方のディレクトリに同名の設定ファイルがある場合は、/etc/systemd/system/以下のファイルが優先される。なので、デフォルト値を変更する場合は、/usr/lib/systemd/systemのファイルをコピーして/etc/systemd/system以下のものを編集するのがいい。

Systemdでの、システムの自動化は以下の順で行われる

  1. Systemdが起動する。
  2. Systemdによって各種Unitの依存関係を検索し、有効化すべきUnitの一覧を作成する。
  3. 一覧から、Unitの順序関係に基づいてUnitを順番に有効化していく。順序関係を持たないUnitは並列に起動処理が行われる。

Unit例

この例はpython3 HOGE.pyというコマンドを起動時に実行するというものです

[Unit]
Description=HOGE
After=network.target
[Service]
ExecStart=/usr/bin/python3 HOGE.py
WorkingDirectory=/put/your/directry
StandardOutput=inherit
StandardError=inherit
Restart=always
User=HOGE
[Install]
WantedBy=multi-user.target
  • [Unit] : 依存関係・順次関係など、Unitのタイプに依存しない設定
  • [Install] : systemctl enable/disableコマンドに関連する設定
  • [Service] : Unitタイプに固有の設定項目

オプションに複数項目を記載するときは、スペース区切りか、同じオプションを複数回に分けて記載する

[Unit] セクション

Description

ユニットの分かりやすい説明です。このテキストは、systemctl statusコマンドの出力に表示されます。

Documentation

ユニットのドキュメントのURL

Requires・Wants・Conflicts

依存関係は、Wants(可能な限り同時起動)、Requires(必ず同時起動)、Comflict(同時起動してはいけない)などを指定することができる。

Before・After

順序関係は、Afrer=やBefore=に対して、指定したUnitより後に起動するか、前に起動するかを定義する。 プロセスAはプロセスBよりも先に起動するといった関係を定義できる。例えば、network.targetを使って順序関係を定義することで、network.targetより前に起動されるUnitはネットワークを準備するUnit、後に起動されるサービスはネットワークを利用するUnitと指定することができる。

[Service] セクション

ExecStart

ユニットの起動時に実行するコマンドまたはスクリプトを指定します。ExecStartPreおよび ExecStartPost は、ExecStartの前後に実行するカスタムコマンドを指定します。

ExecStop

ユニットの停止時に実行するコマンドまたはスクリプトを指定します。

ExecReload

ユニットの再読み込み時に実行するコマンドまたはスクリプトを指定します。

Restart

Restart=no : サービスの再起動は行わない Restart=always : サービスの再起動を行う
このオプションを有効にすると、systemctlコマンドによる完全な停止の例外により、そのプロセスの終了後にサービスが再起動します。デフォルトはno

[Install] セクション

Alias

systemctl enable を除くsystemctl コマンドで、実際のユニット名の代わりにエイリアスを使用できる。 Alias=の後に、fuga.serviceと指定すると、hoge.serviceの自動起動を有効化した際に、hoge.serviceの設定ファイルに対してシンボリックリンク、fuga.serviceが作成される。これによってhoge.serviceは、fuga.serviceという別名でも参照できるようになる。

RequiredBy

該当ユニットに依存するユニットの一覧です。このユニットが有効な場合、RequiredBy に一覧表示されるユニットは、このユニットに関する Require 依存関係を取得します。

Also

enable/disable時に、同時に enable/disableするUnit 該当ユニットと共にインストールまたはアンインストールされるユニットの一覧を指定する。

DefaultInstance

インスタンス化されたユニットに制限された状態で、このオプションは、ユニットが有効にされているデフォルトインスタンスを指定します。

WantedBy

どのランレベルでどんなサービスを起動させるかは自分で決めることができ、これらのプロセスをtargetとしてまとめることでランレベルと同様のプロセス管理を実現している。WantedBy=の後に、multi-user.targetを指定するとrunlevel 2、3と5で有効化する。runlevel 5だけで有効化したい場合は、WantedByにgraphical.targetを指定するということになる。

ランレベル
runlevel0poweroff.targetシャットダウン
runlevel1rescue.target rootのみのシングルユーザーモード
runlevel2multi-user.target ネットワーク・NFSマウントなしのマルチユーザーモード
runlevel3multi-user.target CUIで起動するマルチユーザーモード
runlevel4multi-user.target 未使用(予備のモード)
runlevel5graphical.target GUIで起動するマルチユーザーモード
runlevel6reboot.target システムの再起動

initによる起動では、プロセスの起動順序をランレベル別のディレクトリ(/etc/rc.d/rc?.d)にあるファイルの名前により、各ランレベルで実行するプログラムを指定する。0と6では、システムの停止・再起動時に実行するスクリプトを制御するために使用される。/etc/rc.d/rc?.d以下のシンボリックリンクの名称が該当ランレベルで停止するプロセスはKxxプロセス名・起動するプロセスはSxxプロセス名となっていて、xxの数字の小さいスクリプトから順に実行される。

systemedのコマンド一覧

自動起動する

systemctl enable [サービス名].service

自動起動させない

systemctl disable [サービス名].service

自動起動の状況を確認

systemctl status [サービス名].service

起動中の場合はActive:の項目が緑色で active (running) と表示される。起動しておらず、起動失敗もしていない場合はActive:の項目が inactive (dead) と表示される。起動失敗した場合はActive:の項目が赤字で failed と表示される。

サービスの起動

systemctl start [サービス名].service

サービスの停止

systemctl stop [サービス名].service

サービスの再起動

systemctl restart [サービス名].service

設定ファイルは再読込されない

systemdをリロードする

systemctl daemon-reload

新規にユニットファイルを作ったときに使う。

サービスのリロード

systemctl reload [サービス名].service

設定ファイルが再読込される

ユニットがアクティブかどうか確認する

systemctl is-active [サービス名].service

active/failedが出力される

自動起動するか否か確認

systemctl is-enabled [サービス名].service

disabledかenabledが返ってくる。

ユニットの設定の詳細を確認する

systemctl show [サービス名].service