Amazon Linux2 上で systemd を使ってサービスを運用する機会があったので備忘録。この記事で紹介しているコマンドで最低限の運用はできると思います。
目次
- systemd とは
- systemd は処理を unit という単位で管理する
- unit ファイルの保存先
- systemctl コマンド
- journalctl コマンド
- journalctl のログの右側が切れる場合は方向キーを使う
- journald の設定
- 参考資料
systemd とは
systemd とは linux のシステムとサービスを管理するデーモンです。RHEL7、CentOS7、AmazonLinux2 などは、サービスの管理に systemd が使われています。ps コマンドで確認すると、プロセス番号 1 番で動作しているのが見えます。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 125692 5560 ? Ss 9月17 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
systemd は処理を unit という単位で管理する
systemd は処理を unit という単位で管理します。たとえば nginx に対応する unit は以下のファイルに定義されています。
/usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
上記の nginx.service のファイルでは、プロセスの起動、停止のコマンドなどを定義しています。自分で何かサービスを作りたい場合は、この nginx の unit をベースにすると良いです。他にどんな記述ができるかは man systemd.service
コマンドで確認できます。
unit の type は service 以外にもいくつかあり、 man systemd.unit
コマンドで確認できます。
unit ファイルの保存先
unit ファイルの保存先は以下 2 箇所。
/usr/lib/systemd/system
インストール後の初期保存先。ここのファイルは編集しない。
/etc/systemd/system
ここにファイルを配置すると、初期の設定を上書きできる。自作の unit を作成する場合もここに置くと分かりやすい。
詳しくは man systemd.unit
コマンドで確認を。
systemctl コマンド
unit は systemctl コマンドで管理できます。詳細は man systemctl
コマンドで確認ができます。
systemctl [unitコマンド] [unit名]
Nginx を例にすると、よく使うコマンドは以下の通り。
unit 一覧を表示。
systemctl list-units
unit 一覧を表示(サービスのみ)。
systemctl list-units --type service
unit の起動状態を表示。
systemctl status nginx.service
unit を起動。
systemctl start nginx.service
unit を停止。
systemctl stop nginx.service
unit の自動起動の状態を確認。
systemctl is-enabled nginx.service
unit を自動起動するように設定。
systemctl enable nginx.service
unit を自動起動しないように設定。
systemctl disable nginx.service
unit ファイルを変更した後、変更を反映。
systemctl daemon-reload
ちなみに systemctl status nginx
のように .service
は省略可能です。
journalctl コマンド
unit が標準出力したログは systemd journal に格納されます。journal に格納されたログは journalctl
コマンドで参照することができます。ログを確認するためによく使うコマンドは以下の通り。詳細は man journalctl
コマンドで確認を。
-e
オプションで最新の journal ログを表示する。
journalctl -e
-x
オプションで詳細なログを表示。
journalctl -ex
-f
オプションで最新ログを流し続ける(tail -f のイメージ)。
journalctl -f
-u
オプションで特定の unit のログのみ表示する。複数のサービスのログの表示もできる。
journalctl -u nginx.service -u docker.service
-k
オプションでカーネルのログのみ表示する。
journalctl -ek
-S(--since)
、-U(--until)
オプションで日時で絞る。
journalctl -S "2022-10-16 12:44:00" -U "2022-10-16 12:45:00"
--grep
オプションでキーワード検索。OS によっては使えないこともあります。man コマンドでオプションが使えるか確認してみてください。
journalctl --grep "level=error"
--no-pager
オプションでページング処理をしない。パイプで別の処理に渡すときなどに使えると思います。
journalctl --no-pager | grep "level=error"
journalctl のログの右側が切れる場合は方向キーを使う
1行に表示されるログが長い場合、表示されるログの折返しがされず、右側のログが切れてしまいます。この場合は ← キーと → キーで左右に移動し、切れたログを確認することができます。less コマンドと同じ動きです。
journald の設定
/etc/systemd/journald.conf
に設定ファイルがあります。ここでログの保存先や保存容量など設定できます。
AmazonLinux 2 のデフォルト値で把握しておくべきところは以下の通り。詳細は man journald.conf
コマンドを参照してください。
Storage=auto
ログの保存先。/var/log/journal
ディレクトリがあればそこに保存、なければ /run/log/journal
つまりメモリ上に保存。AmazonLinux 2 では /var/log/journal
に保存されます。
SystemMaxUse=, SystemKeepFree=, SystemMaxFileSize=
ログの保存先としてディスク/var/log/journal
が選択されている場合のログの保存容量の設定。
SystemMaxUse=
は journald が最大で使用するディスク容量を設定できます。SystemKeepFree=
は journald 以外の用途のためにどれだけのディスク容量を空けるかを設定できます。どちらか小さい方の値が全体の保存容量として使われます。SystemMaxUse=
のデフォルトはディスク容量の 10% で上限 4GB。SystemKeepFree=
のデフォルトは ディスク容量の 15% で上限 4GB。つまり、ディスク容量に余裕がある環境でデフォルト値で運用すると journal に保存されるログの容量の最大値は 4GB になることが多いです。
SystemMaxFileSize=
は個々の journal ファイルの最大容量を設定します。この設定は、ローテーションされてログが削除される単位に影響します。デフォルトでは SystemMaxUse=
の 1/8 に設定されるので、 通常 7 つのローテーションされたジャーナルファイルが保持されます。ログが消えるときはこの単位で消えるので、古いログから徐々に消えておくのではなく、ある程度の量がまとめて消えると覚えておくと良いでしょう。
RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize=
ログの保存先をメモリに設定した場合はこちらの設定が使われます。SystemMaxUse などと説明は同じです。
参考資料
次回は firewalld のことを説明します。
-
最低限知っておきたいfirewalldの使い方
CentOS7 で firewalld を使う機会があり、調べたことの備忘録。zone の説明と、firewall-cm ...
続きを見る