🍑あわもり教室🫧 クラウドの「手前」を、ちゃんとやる。 はじめる
SET 0240分

プロセス、サービス、ログ

実行中のプログラムを確認し、サービスの状態とログから問題の場所を絞ります。

このレッスンのメニュー

ファイルとして置かれたプログラムを起動すると、OSがメモリを割り当てて処理を進めます。 この実行中の状態をプロセスと呼びます。

実行中のプログラムを見る

OSは各プロセスへプロセスID(PID)という番号を付けます。 psは実行中のプロセスを一覧で表示し、topはCPUやメモリを多く使うプロセスを繰り返し表示します。

ps -ef
top

一つのプログラムから複数のプロセスが起動することもあります。 一覧では、PID、実行ユーザー、起動したプログラム、CPUとメモリの使用量を確認します。

プロセスへ終了を頼む

シグナルは、OSを通してプロセスへ終了や再読み込みなどを伝える仕組みです。

kill -TERM 1234

killプログラムは、指定したPIDのプロセスへシグナルを送るようOSへ頼みます。 TERMは、プロセスへ終了を頼むシグナルです。 プロセスは終了前に、開いているファイルを閉じるなどの後片づけができます。

起動したプロセスを確認して止める

sleep 300 &
job_pid=$!
ps -p "$job_pid" -o pid,user,state,command
kill -TERM "$job_pid"
wait "$job_pid"

sleep 300 &は、300秒待つプロセスを画面の裏側で起動します。 $!には、直前に起動したプロセスのPIDが入ります。 psで対象を確認してから、killで終了を頼みます。

サービスは長く動くプロセス

サービスは、リクエストの受け付けや定期処理のために、長時間動かすプロセスです。 多くのLinuxディストリビューションでは、systemdというプロセスがサービスの起動、停止、再起動を管理します。

systemctl status nginx
systemctl cat nginx
journalctl -u nginx --since "10 minutes ago"

statusで現在の状態、catで起動時の設定、journalctlで直近の記録を確認します。 systemctlは、systemdへサービスの操作を依頼するためのプログラムです。 journalctlは、systemd-journaldが保存したログを読むプログラムです。

Webサーバーが通信を待つポートを確認する

Webサーバーは、設定されたIPアドレスとポート番号で通信を待ち受けます。

ss -lntp
curl -v http://127.0.0.1:8080/

ssは、Linuxカーネルが持つ通信の状態を読みます。 curlはHTTPリクエストを送るプログラムです。 127.0.0.1:8080は、同じホストから届く通信を8080番ポートで受け取ります。 0.0.0.0:8080は、そのホストのIPv4インターフェース全体で待ち受ける指定です。

ログは時刻と依頼内容から読む

ログには少なくとも次の情報があると調査しやすくなります。

  • タイムスタンプとタイムゾーン
  • 重大度(info、warn、errorなど)
  • リクエストIDや処理ID
  • 何をしようとしたか
  • 失敗の理由

秘密情報、認証トークン、パスワードは、読み取れる人を増やさないようログから除外します。

つながらないWebサーバー

Pythonがある環境で実行します。

python3 -m http.server 8080 --bind 127.0.0.1

シェルはpython3を起動し、Pythonに付属する簡易Webサーバーを一つのプロセスとして動かします。 --bind 127.0.0.1は、自分自身から届く通信だけを受ける設定です。

別のシェルから次を確認します。

ss -lntp | grep 8080
curl -I http://127.0.0.1:8080/

次にプロセスを止め、--bind 0.0.0.0 で起動します。 ss のLocal Addressがどう変わるか比べてください。

Webサーバーへ接続できないときの確認順

Webサーバーのプロセス状態、待ち受けポート、同じマシン内からの接続、利用者側のPCからの接続の順で調べる流れ
Webサーバーが動くマシンの内側から利用者の接続元へ向かって確認すると、問題がある範囲を絞れます。
  1. systemctl status でプロセスの状態を見る
  2. journalctl で起動失敗の理由を見る
  3. ss で待ち受けアドレスとポートを見る
  4. 同じホストから curl する
  5. 利用者側のPCから接続し、通信経路や通信を許可する設定を調べる

この順番なら、アプリケーションの問題とネットワークの問題を混ぜずに進められます。

このレッスンは完了

このページで扱った流れを確認したら、次の内容へ進みます。