systemdとはのOSシステムの起動やサービスの管理を行う常駐プログラムです。今回の記事ではWebシステム開発でよく使われるsystemdのコマンドやユニットファイルの設定について学習していきます。
systemdの基本コマンド
systemctl コマンドを使用してサービスの管理を行う事ができます。
サービスの状態確認・起動・停止
以下はnginx Webサーバの例です
【サービスの状態確認】
systemctl status nginx
【サービスの起動】
systemctl start nginx
【サービスの停止】
systemctl stop nginx
【サービスの再起動(停止&起動)】
systemctl restart nginx
【プロセスの再起動はせず設定ファイルの読み直し】
systemctl reload nginx
システムブート時のサービス起動設定
【自動起動設定の確認】
systemctl is-enabled nginx
【自動起動有効化】
systemctl enable nginx
【自動起動無効化】
systemctl disable nginx
設定ファイルの再読み込み
後述のユニットファイルの設定の再読み込みを行います。
systemctl daemon-reload
ログ管理
後述のユニットファイルがうまく動かない場合にログを確認できます。
journalctl -b
journalctl -xeu サービス名.service
ユニットファイルの作成
ユーザが管理するサービスを作成する場合は、ユニットファイルと呼ばれる設定ファイルを以下のディレクトリ内に作成します。
/etc/systemd/system/
ユニットファイルには目的に応じた拡張子がありますが、サービスプログラムの場合は以下のファイル名になります。
サービスプロセス名.service
ユニットファイル内のセクション
ユニットファイル内には以下3つのセクションがあります。
[Unit]
サービスの説明と他のサービスの依存関係を定義します。
[Service]
コマンドに連動したサービスの起動・停止の挙動を定義します。
[Install]
システムブート時のサービスの起動設定を定義します。
それぞれのセクション内の設定項目を見ていきましょう。
[Unit]セクション
- Description=
-
サービスの説明文。systemctl statusコマンドで表示されます。
- Requires=
-
当ユニットが起動すると同時に開始するユニットを指定します。Requires単体では起動順は保証されません。当サービスの前提となるサービスがある場合はAfter=と組み合わせて起動順を制御する必要があります。強制力のある依存関係のサービスを指定するので依存先のサービスの起動が失敗すると当ユニットも起動されません。
- Wants=
-
当ユニットが起動すると同時に、可能なら開始される別のユニットを指定します。強制力のないゆるい依存関係のサービスを指定するので、依存先のサービスの起動が失敗しても当ユニットは起動されます。
- Before=
-
指定したユニットの前にに当ユニットを起動します。
- After=
-
指定したユニットの後に当ユニットを起動します。
- AssertPathIsDirectory=
-
必須となるディレクトリパスを指定します。指定したパスがない場合はサービスは起動しません。
[Service]セクション
- Type=
-
サービスの起動方法を指定します。以下は指定可能なオプションの一例です。
simple・・・(デフォルト)ExecStart= のコマンド実行直後にsystemd はサービスの起動完了と判断する。
forking・・・サービスを常駐プログラムのデーモンとして使用する場合に指定。ExecStart= のコマンドが完了するとsystemd はサービスの起動完了と判断する。
oneshot・・・常駐プログラムとしてではなく、コマンドを1回実行して終了する。デフォルトでは RemainAfterExit=yes が必須。 - Environment=
-
ユニットファイル内で使用する環境変数を定義します。
- ExecStart=
-
systemctl start コマンドで実行する起動コマンドを指定。
- ExecStop=
-
systemctl stop コマンドで実行する起動コマンドを指定。
- ExecReload=
-
systemctl reload コマンドで実行するコマンドを指定。
- Restart=
-
サービスが異常終了した場合の挙動の指定。以下は指定可能なオプションの一例です。
no・・・再起動しない(デフォルト)
always・・・理由を問わず必ず再起動
on-abnormal・・・異常終了時に再起動 - User=
-
ルートユーザ以外で実行したい場合のユーザを指定。
- Group=
-
サービスを実行するグループを指定。デフォルトはUser=に指定したユーザのプライマリグループ。
- WorkingDirectory=
-
プロセスの作業ディレクトリを指定。
[Install]セクション
- WantedBy=
-
システム起動時にここで指定した起動ターゲットに達すると当ユニットフィアルを同時に起動させる。ゆるい依存関係なので、当ユニットファイルの起動に失敗してもシステムの起動自体には影響しない。
- RequiredBy=
-
WantedBy=同様に、システム起動時にここで指定した起動ターゲットに達すると当ユニットファイルを同時に起動させる。ただし、強い依存関係なので当ユニットファイルの起動に失敗すると、システムの起動不可になる可能性があるので注意が必要です。
RequiredBy=を指定する場合は、システムの起動ができなくなる可能性があるので十分な注意が必要です。
ユニットファイルの作成例
AWSのS3ストレージの自動マウント
ユニットファイルの作成
以下の場所とファイル名でユニットファイルを作成してみましょう。
sudo vi /etc/systemd/system/mount-s3.service
ユニットファイルの内容
[Unit]
Description=Mountpoint for Amazon S3 mount
Wants=network.target
After=network-online.target remote-fs.target
AssertPathIsDirectory=/mnt/s3
[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/bin/mount-s3 my-bucket-name /mnt/s3 --allow-other --allow-delete --allow-overwrite
ExecStop=
[Install]
WantedBy=remote-fs.target
参考リンク:Configuring Mountpoint for Amazon S3
システム起動時の自動マウント設定
sudo systemctl enable mount-s3.service
systemdのリロード
ファイル作成後はsystemdのリロードをして作成したサービスを認識させましょう。
sudo systemctl daemon-reload
まとめ
今回の記事ではサービスの管理を行うsystemd デーモンについて学習しました。サービスの起動や停止のコマンドや、システム起動時のサービス自動起動のコマンドについて学びました。サービスの定義にはユニットファイルを作成する必要がありましたね。ユニットファイル内にはUnit、Service、Installの3つのセクションがありました。各セクションの設定項目は多いので、都度必要に応じて一つずつ試していきましょう。ユニットサービスが作れて、systemctl コマンドが使えると短いサービス名で長い起動コマンドを扱えるので覚えやすく、作業効率も上がります。是非活用していきましょう。
コメント