Phase 1ではsystemctlの基本操作を学びました。この記事ではsystemdの内部構造・ユニットファイルの書き方・依存関係管理まで深掘りします。自作サービスを登録して自動起動させるところまで解説します。
systemdとは?initとの違い
systemdはLinuxの初期化システム(PID 1)です。従来のinitと比較して、サービスの並列起動・依存関係管理・ログの一元管理(journald)などが大幅に強化されています。Ubuntu 15.04以降、RHEL 7以降で標準採用されています。
ユニットの種類
| ユニット種類 | 拡張子 | 用途 |
|---|---|---|
| Service | .service | デーモン・サービスの管理 |
| Timer | .timer | 定期実行(cronの代替) |
| Socket | .socket | ソケットベースのアクティベーション |
| Target | .target | ユニットのグループ化(runlevel相当) |
| Mount | .mount | ファイルシステムのマウント |
| Path | .path | ファイル変更の監視 |
systemctl コマンド詳細
# サービスの状態確認(詳細)
$ systemctl status nginx
# 全サービスの状態一覧
$ systemctl list-units --type=service
# 起動失敗したサービスを確認
$ systemctl list-units --state=failed
# 依存関係を確認
$ systemctl list-dependencies nginx
# サービスのユニットファイルを確認
$ systemctl cat nginx
# ユニットファイルの変更後にリロード
$ sudo systemctl daemon-reload
# デフォルトのターゲット(起動レベル)を確認
$ systemctl get-default
# ターゲットを変更(例:GUIなしのmulti-user)
$ sudo systemctl set-default multi-user.target
自作サービスのユニットファイルを書く
自分のスクリプトやアプリをsystemdサービスとして登録する方法です。
# ユニットファイルの配置場所
/etc/systemd/system/ # システム管理者が作成(推奨)
/usr/lib/systemd/system/ # パッケージがインストールするもの
# 例:/etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target # ネットワークスタック起動後に起動
# ⚠️ network.target は「ネットワークが実際に使える状態」を保証しません
# 接続完了まで待ちたい場合(API呼び出しなど)は以下を使う
# Wants=network-online.target
# After=network-online.target
[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
ExecStop=/opt/myapp/stop.sh
Restart=on-failure # 失敗時に自動再起動
RestartSec=5 # 再起動まで5秒待つ
StandardOutput=journal # ログをjournaldに送る
StandardError=journal
[Install]
WantedBy=multi-user.target # multi-user起動時に有効化
# 登録・有効化・起動
$ sudo systemctl daemon-reload
$ sudo systemctl enable myapp
$ sudo systemctl start myapp
$ sudo systemctl status myapp
# ログを確認
$ journalctl -u myapp -f
Serviceセクションの主要オプション
| オプション | 説明 |
|---|---|
| Type=simple | ExecStartが起動したプロセスがメインプロセス(デフォルト) |
| Type=forking | プロセスがforkしてデーモン化する場合 |
| Type=oneshot | 1回だけ実行して終了するスクリプト向け |
| Restart=always | 常に再起動(終了コードに関わらず) |
| Restart=on-failure | 失敗時のみ再起動 |
| TimeoutStartSec=30 | 起動タイムアウト(秒) |
| LimitNOFILE=65536 | 開けるファイル数の上限 |
まとめ
- systemdはPID 1として全サービスを管理。並列起動・依存関係・ログ一元管理が特徴
systemctl list-units --state=failedで障害を即座に特定- ユニットファイルは
/etc/systemd/system/に配置しdaemon-reload後に有効化 After=network.targetはネットワークスタックの後に起動するが接続完了は保証しない。実際のネットワーク接続が必要ならWants=network-online.target+After=network-online.targetを使うRestart=on-failureで自動復旧
📋 Linuxサーバー運用・管理チェックリスト完全版でPhase 2の全要点を確認できます。



コメント