プロセス、サービス、ログ
実行中のプログラムを確認し、サービスの状態とログから問題の場所を絞ります。
このレッスンのメニュー
ファイルとして置かれたプログラムを起動すると、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サーバーへ接続できないときの確認順
systemctl statusでプロセスの状態を見るjournalctlで起動失敗の理由を見るssで待ち受けアドレスとポートを見る- 同じホストから
curlする - 利用者側のPCから接続し、通信経路や通信を許可する設定を調べる
この順番なら、アプリケーションの問題とネットワークの問題を混ぜずに進められます。
このレッスンは完了
このページで扱った流れを確認したら、次の内容へ進みます。