最低限知っておきたいsystemctlとjournalctlの使い方

2019年9月21日

systemd

Amazon Linux2 上で systemd を使ってサービスを運用する機会があったので備忘録。この記事で紹介しているコマンドで最低限の運用はできると思います。

目次

  1. systemd とは
  2. systemd は処理を unit という単位で管理する
  3. unit ファイルの保存先
  4. systemctl コマンド
  5. journalctl コマンド
  6. journalctl のログの右側が切れる場合は方向キーを使う
  7. journald の設定
  8. 参考資料

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
最低限知っておきたいfirewalldの使い方

CentOS7 で firewalld を使う機会があり、調べたことの備忘録。zone の説明と、firewall-cm ...

続きを見る

-技術ブログ
-