よく使うsystemdについてまとめていく
概要
- Unitについて
- service
- target
- timer
- Unitファイルの書き方
- *.service
- *.target
- *.timer
- ユニットファイルの例
- service
- timer
- 参考
具体的なユニットファイルの作成はこちら
WordPressの更新をsystemdのtimerをつかって自動化する
Unit
systemdではデーモンやデバイス、タイマー、socketなど様々なコンフィグファイルをユニットファイルという形で表す。
優先順位は
- /etc/systemd/*
- /usr/lib/systemd/*
で参照される。
また、
# systemd edit foo.service
コマンドで編集した場合
/etc/systemd/system/foo.servce.d/override.conf
にオーバーライドする項目だけの設定を記述することができる。
service
sshdやnginxと言ったものはここに登録していく。他にも定期実行するスクリプト類も登録できる。
target やtimerと言ったものからserviceを呼び出すことができる。
自身の依存関係や起動順序、異常終了時に再起動する設定などもできる。
target
複数のサービスを束ねたもの。
基本的には、依存関係を記述するために機能ごとにまとめたりするために用いる。
timer
cronの代替となる。
このタイマーがトリガーとなりserviceを起動させる。
Unitファイル
基本的な書き方を説明する。
また、[foo] のようなものをfooセクションといいこれで分かれている。
共通部分
[Unit]
Description= ユニットに対する説明を書く部分。
Documentation= ドキュメントの場所を記述する。URLやmanの参照位置など。
Requires= 依存関係において必須のユニットを指定する。スペース区切り。対象が起動できない場合は自らは起動に失敗する。
Wants= 依存関係の定義。こちらは対象が起動に失敗しても起動できる。
Conflicts= 依存関係の定義。対象のユニットが存在する場合起動しない。
Before=, After= 起動順序の指定。Beforeならその前、Afterならその後に起動する。BeforeにWants,Requiresのユニットを含んではいけない。
[Install]
WantedBy=, RequiredBy= ユニットを有効化した際になにの前提ユニットとして登録されるかを指定する。
*.service
[Unit],[Install]セクションを含める。
[Service]
ExecStart= サービス起動時に実行されるコマンドを指定する。
サービス起動判定にはこれが使用される。
ExecStartPre= , ExecStartPost= 起動の判定には含めずに事前、事後処理を行わせる際に記述する。
複数指定するとその順に実行される。
RemainAfterExit= コマンドの実行が終了した際にもサービスとしては起動していることにするかを指定する。Bool。デフォルトではno。
PIDFile= systemdが監視するPIDFileを指定する。
ExecReload= reloadコマンドで実行するコマンドを指定する。
ExecStop= stopコマンドで実行するコマンドを指定する。
ExecStopPost= stopのあとに実行される
Type=
serviceユニットが実行されるタイプを指定する。
- simple
ExecStartのコマンドの実行を始めた時点でサービスの起動とみなす。デフォルトではこれになっている。 - forking
起動スクリプト等から起動するバックグラウンドのプロセスがメインプロセスとなる時に使用する。
フォークのタイプによりメインプロセスがわからないためPIDFile=でPIDファイルを渡す必要がある。 - oneshot
ExecStartのコマンドの実行が終了した時点で起動完了とみなす。そして即座に終了する。
終了してもサービスとして起動していると認識させたいときはRemainAfterExit=yesを指定する。 - dbus
基本的にはsimpleと似ている。起動のタイミングをdbusを通じて通知する。 - notify
Type=dbusとの違いはsd_notify(3)を用いて起動を通知する点にある。
NotifyAccess=を用いて使用するsocketを指定できる。 - idol
simpleに似ている。しかし、この実行は他のジョブが終了するまで遅延される。
RestartSec= restartするための待機時間を指定する。
Restart= プロセス終了時に再起動するかを指定する。no,always,on-success,on-failure, on-abnormal, on-watchdog, on-abortがある。デフォルトはno。今回はよく使うものだけ説明する。
- no
終了しても何もしない - always
常に再起動する - on-success
成功した時(exit 0)の時再起動する - on-failure
終了コード0以外の時再起動する
*.target
基本的に[Unit],[Install]セクションを用いる。
[Target]セクションも存在するが基本的には使用しないことが多い。
[Target]
DefaultDependencies= デフォルトではno。 DefaultDependencies=no
の時Wants=, Requires=を自動補完する。
*.timer
[Unit].[Install]セクションを含める。
[Timer]
OnBootSec=, OnStartupSec=, OnUnitActiveSec= OnUnitInactiveSec=
順に、ブート時、timerスタート時、前にユニットが動いてから、前にユニットが終了してからの経過時間を指定する。
OnCalendar=
カレンダー形式で指定する。定期的に実行させたい時に用いる。
ユニットファイルの例
service
minecraftのサーバーの起動例
シェルのラッパーを噛ませています。
[Unit]
Description=The Minecraft Server
After=network.target nss-lookup.target
[Service]
Type=simple
WorkingDirectory=/var/minecraft/data/%I
EnvironmentFile=/var/minecraft/etc/%I.d/rcon.env
ExecStartPost=/var/minecraft/bin/pre_do.sh %I
ExecStart=/var/minecraft/bin/server_do.sh ${javaopt} ${JARNAME}
ExecStop=/var/minecraft/bin/server_stop.sh
User=minecraft
Group=minecraft
Restart=always
RestartSec=120
StartLimitInterval = 20m
StartLimiBurst = 3
[Install]
WantedBy=multi-user.target
timer
[Unit]
Description=foo timer
[Timer]
OnCalendar=*-*-* 21:00:00
Unit=foo.service
[Install]
WantedBy=timers.target
#参考
centos7,ubuntu16.04のman
Arch Linuxのwiki systemd
具体的なユニットファイルの作成はこちら