Contents
- 1 用語
- 2 設定
- 3 Unit設定ファイルの記法
- 3.1 [Unit]セクションの主要オプション
- 3.2 [Service]セクションの主要オプション
- 3.2.1 ExecStart
- 3.2.2 ExecReload
- 3.2.3 ExecStop
- 3.2.4 ExecStartPre/ExecStartPosl
- 3.2.5 ExecStopPost
- 3.2.6 KillMode
- 3.2.7 EnvironmentFile
- 3.2.8 Type
- 3.2.9 PIDFile
- 3.2.10 BusName
- 3.2.11 Restart
- 3.2.12 User / Group
- 3.2.13 PrivateTmp
- 3.2.14 ReadOnlyDirectories
- 3.2.15 InaccessibleDirectOries
- 3.2.16 RootDirectory
- 3.2.17 NonBlocking
- 4 Tips
用語
サービス
特定のプログラム(パッケージ、プロセス)のこと
ユニット
単一のサービスの起動、終了などを管理する単位
ターゲット
複数のユニットをまとめたもの。
従来のランレベルに相当する。
ターゲット名 | 内容 | 従来のランレベル |
poweroff | システム停止 | 0 |
rescue | シングルユーザモード | 1 |
multi-user | マルチユーザモード(CUI) | 3 |
graphical | マルチユーザ(GUI) | 5 |
reboot | 再起動 | 6 |
emergency | 緊急 | – |
emergencyはrescueよりも深刻な状態、ルートパーティションもマウントできない場合等で利用する。
設定
ターゲット(ランレベル)
現在のターゲットの確認
systemctl get-default
ターゲットの変更
systemctl set-default <ターゲット名>.target
一覧表示
systemctl list-units --type=target --all --no-pager
サービス
サービス名の正式名称は”<サービス名>.service”であるが、”.service”は省略できる。
一覧表示
- 全サービス表示
systemctl list-unit-files --type service --no-pager
- 有効化されているユーザ指定サービスのみ表示
ls -1 /etc/systemd/system/<ターゲット名>.target.wants/
通常は下記でよい
ls -1 /etc/systemd/system/multi-user.target.wants/
- 無効化されているサービス
ls -1 /etc/systemd/system/
起動
systemctl start <サービス名>
停止
systemctl stop <サービス名>
有効化
再起動しても自動で起動するようにする
systemctl enable <サービス名>
※maskで無効化されている場合は次のコマンド
systemctl unmask <サービス名>
これは次のようにリンクを作成するのと同じである。
ln -s /usr/lib/systemd/system/<サービス名>.service /etc/systemd/system/<ターゲット名>.target.wants/
この方法では現在のターゲットと異なるターゲットにサービスを登録できる。
なお、通常はmulti-userターゲットしかディレクトリが存在しないため、他のターゲットにサービスを始めて登録する際にはそのターゲットのディレクトリを作成する必要がある。
無効化
- 手動起動は可能な無効化
systemctl disable <サービス名>
- 手動機能も不可能な無効化(起動状態がstaticなサービスはこちらを使用する)
systemctl mask <サービス名>
ステータス確認
systemctl status <サービス名>
新規サービス登録
以下ではターゲット”multi-user”でのサービスを作成している。
別途起動プログラムに実行権限を付与しておくこと。
cat > /etc/systemd/system/<サービス名>.service << EOT [Unit] Description = <デスクリプション> [Service] ExecStart = <プログラムパス> Restart = always Type = simple [Install] WantedBy = multi-user.target EOT
複数インスタンスの起動許可
複数インスタンス起動可能にする場合、サービスファイルに”@<インスタンスID>”を付ける。
例えば、service_aをインスタンスID”ins1″、”ins2″でそれぞれ作成する場合は次のファイルを作成する。
/etc/systemd/system/service_a@ins1.service
/etc/systemd/system/service_a@ins2.service
サービスファイル中で変数”%i”を使用すると、インスタンスIDに置換される。
なお、ターミナルで@を入力する際はエスケープを付けても付けなくても同じである。
ターゲットの変更
ターゲットはサービスファイルにて定義されている。
例えばmulti-userターゲットで起動させる場合は次の定義がある。
[Install] WantedBy = multi-user.target
ターゲットを変更する場合はこの部分を修正すればよい。
修正した場合は、次のコマンドで再読み込みをすること。
systemctl daemon-reload
デフォルトサービスの定義内容の確認
cat /usr/lib/systemd/system/<サービス名>.service
ログ確認
journalctl -u <サービス名>
サービス修正
修正後、次のコマンドを実行し、変更を反映する
systemctl daemon-reload
Unit設定ファイルの記法
[Unit]セクションの主要オプション
Descrlptlon
Unitの説明文
Documentation
ドキュメントのURI
Requires / Wants
このUnitと同時に有効化が必要なUnit
After
このUnitより先に起動するべきUnit
Before
このUnitより後に起動するべきUnit
[Service]セクションの主要オプション
ExecStart
サービス起動コマンド。
不明な場合は次で良い。
ExecStop = /bin/kill ${MAINPID}
ExecReload
サービスリロードコマンド
不明な場合は次で良い。
ExecReload = /bin/kill -HUP ${MAINPID}
ExecStop
サービス停止コマンド
ExecStartPre/ExecStartPosl
サービス起動前後の追加コマンド
サービスの起動判定には関連しない
ExecStopPost
サービス停止後に実行するコマンド
サービスが異常停止した際にも実行
KillMode
ExecStop実行後に残ったプロセスの処理方法
- 設定値
- none
残プロセスはそのまま放置する
- none
- process
親プロセスが残っている場合はSlGTERM/SlGKlLLで停止する
そのほかの残プロセスは放置する
- control-group
グループ内のすべての残プロセるをSlGTERM/SlGKlLLで停止する
EnvironmentFile
環境変数として読み込むファイル。
読み込んだ環境変数で定義された値を、Unit設定ファイル中で使用することができる。
Unit設定ファイルは変更すると、”systemctl daemon-reload”の実行が必要なため、設定変更する可能性のあるものは環境変数ファイル化しておくとよい。
環境変数は通常と同じく次の形式で参照可能。
${<環境変数名>}
Type
サービスプロセスの起動完了の判定方法
- デフォルト
simple
- 値
- simple
実行後、プロセスがフォアグラウンドで動作するタイプ
- simple
-
- forking
子プロセスを生成して、親プロセスは終了するタイプ
- forking
-
- oneshot
コマンドの実行後、直ちに終了するタイプ
子プロセスを生成するのではなく、別の親プロセスを生成するプログラムなどである
- oneshot
PIDFile
fork型サービスのPlDファイル
BusName
D-Bus型サービスのbus接続名
Restart
メインプロセス異常停止時に再起動するかどうかの指定
- デフォルト
no
- 設定値
- 自動再起動
Restart = always
- 自動再起動
User / Group
プロセスを起動するユーザ、グループ
PrivateTmp
このサービス専用の/tmpと/var/tmpを用意する
ReadOnlyDirectories
指定のディレクトリ以下をReadOnlyモードにする
InaccessibleDirectOries
指定のディレクトリ以下をアクセス不可にする
RootDirectory
指定のディレクトリにchrootする
NonBlocking
Socketユニットを使用する際のみ有効なオプションで、起動時にすべてのファイルディスクリプタにO_NONBLOCKフラグをセットする。
これによってファイル操作をノンブロッキングモードで行える。
標準ではfalseである。
Tips
起動時間の測定
systemd-analyze
systemctlのサブコマンドの補完
systemctl bash completionをインストールすることでsystemctlコマンドのサブコマンド(start、stop等)をtabキーにより補完できる。
- インストール
yum -y install bash-completion
wget https://github.com/terralinux/systemd/raw/master/src/systemctl-bash-completion.sh -O /etc/bash_completion.d/systemctl-bash-completion.sh
その他の実行ファイル?
systemd-analyze
systemd-ask-password
systemd-cat
systemd-cgls
systemd-cgtop
systemd-coredumpctl
systemd-delta
systemd-detect-virt
systemd-escape
systemd-firstboot
systemd-hwdb
systemd-inhibit
systemd-loginctl
systemd-machine-id-setup
systemd-notify
systemd-nspawn
systemd-path
systemd-run
systemd-stdio-bridge
systemd-tmpfiles
systemd-tty-ask-password-agent
systemd-sysv-convert
teamdctl
wdctl
bootctl
busctl
coredumpctl
hostnamectl
journalctl
localectl
loginctl
machinectl
systemctl
systemd-coredumpctl
systemd-loginctl
timedatectl
kdumpctl
sysctl
usernetctl
auditctl