systemd

Contents

用語

 

サービス


特定のプログラム(パッケージ、プロセス)のこと

ユニット


単一のサービスの起動、終了などを管理する単位

ターゲット


複数のユニットをまとめたもの。
従来のランレベルに相当する。

ターゲット名 内容 従来のランレベル
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 start <サービス名>

 

停止

 

systemctl stop <サービス名>

 

有効化

再起動しても自動で起動するようにする

systemctl enable <サービス名>

※maskで無効化されている場合は次のコマンド

systemctl unmask <サービス名>


これは次のようにリンクを作成するのと同じである。

ln -s /usr/lib/systemd/system/<サービス名>.service /etc/systemd/system/<ターゲット名>.target.wants/

この方法では現在のターゲットと異なるターゲットにサービスを登録できる。
なお、通常はmulti-userターゲットしかディレクトリが存在しないため、他のターゲットにサービスを始めて登録する際にはそのターゲットのディレクトリを作成する必要がある。

無効化

ステータス確認

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実行後に残ったプロセスの処理方法

 

 

 

EnvironmentFile

環境変数として読み込むファイル。
読み込んだ環境変数で定義された値を、Unit設定ファイル中で使用することができる。

Unit設定ファイルは変更すると、”systemctl daemon-reload”の実行が必要なため、設定変更する可能性のあるものは環境変数ファイル化しておくとよい。

環境変数は通常と同じく次の形式で参照可能。

${<環境変数名>}

 

Type

サービスプロセスの起動完了の判定方法

 

 

PIDFile


fork型サービスのPlDファイル

BusName


D-Bus型サービスのbus接続名

Restart


メインプロセス異常停止時に再起動するかどうかの指定



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キーにより補完できる。

 

その他の実行ファイル?


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


Notice: Trying to get property 'queue' of non-object in /usr/local/wordpress/wp-includes/script-loader.php on line 2876

Warning: Invalid argument supplied for foreach() in /usr/local/wordpress/wp-includes/script-loader.php on line 2876