Linux

プロセス・サービス・ネットワーク

動いている処理と通信経路を、推測ではなくコマンドの結果から確認しましょう。

01

プロセスを確認する

現在のシェルCOMMAND
ps -p $$ -o pid,ppid,user,stat,comm
表示例OUTPUT
    PID    PPID USER     STAT COMMAND
   2451    2440 mity     Ss   bash

PIDはプロセス番号、PPIDは親、STATは状態です。全体はps aux、変化を見続けるならtopを使います。

名前で探すCOMMAND
pgrep -a bash
表示例OUTPUT
2451 bash
02

終了とシグナル

練習プロセスを終了COMMAND
sleep 300 &
pid=$!
echo "$pid"
kill "$pid"
wait "$pid" 2>/dev/null
echo $?
表示例OUTPUT
3180
143

&はバックグラウンド実行、$!は直前のPIDです。引数なしのkillは終了を依頼するSIGTERMを送ります。143は一般に128+15(SIGTERM)です。

kill -9は最後の手段 SIGKILLは後片付けの機会を与えません。まず通常終了、サービスならsystemctl stop、次にSIGTERMを試し、対象PIDを確認します。
03

systemdサービスを調べる

systemd採用環境ではサービスをunitとして管理します。読み取り操作は一般ユーザーでも可能な場合があります。

状態と自動起動を確認COMMAND
systemctl is-active ssh
systemctl is-enabled ssh
Debian/Ubuntuでの表示例OUTPUT
active
enabled

RHEL系のOpenSSHサーバーは通常sshdです。存在する名前は次で絞り込みます。

unitを探すCOMMAND
systemctl list-unit-files --type=service | grep -E '^(ssh|sshd)\.' 
restartの影響 sudo systemctl restart sshdは接続中のSSHや利用者へ影響し得ます。設定検証、別の接続手段、保守時間を用意してから実施します。
04

journalctlでログを読む

今回の起動でのエラーCOMMAND
journalctl -b -p err --no-pager | tail -n 10
問題がない場合の例OUTPUT
-- No entries --

-bは今回の起動、-p errはerror以上です。サービス単位はjournalctl -u ssh --since todayのように調べます。閲覧権限や保存設定により見える範囲は異なります。

05

IPアドレスと経路

インターフェースと経路COMMAND
ip -brief address
ip route
表示例OUTPUT
lo      UNKNOWN  127.0.0.1/8 ::1/128
eth0    UP       192.0.2.10/24
default via 192.0.2.1 dev eth0

loは自分自身、defaultはより具体的な経路がない通信の送り先です。192.0.2.0/24は文書用アドレスで、実環境の表示とは異なります。

06

名前解決を確認する

ホスト名からアドレスを得るCOMMAND
getent hosts example.com
表示例OUTPUT
2600:1406:5e00:6::17ce:bc12 example.com

getentはシステムの名前解決設定に従います。環境によってIPv4とIPv6の両方、またはいずれか一方だけが表示され、アドレス自体も時期・場所で変わります。詳細なDNS問い合わせには、導入されていればdig example.comを使えます。

07

待受ポートと接続を確認する

TCP待受COMMAND
ss -lntp
表示例OUTPUT
State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*

0.0.0.0:22は全IPv4インターフェースの22番で待受中という意味です。プロセス名は権限がないと表示されない場合があります。待受していてもファイアウォールや経路のため外部から接続できるとは限りません。

08

HTTPを段階的に確認する

レスポンスヘッダーCOMMAND
curl -I https://example.com/
表示例OUTPUT
HTTP/2 200
content-type: text/html
content-length: 1256

実際のヘッダーは変わります。失敗時は、(1)インターフェース、(2)経路、(3)名前解決、(4)ポート、(5)アプリケーションの順に切り分けます。pingに応答しないだけで停止とは断定できません。

PRACTICE

ミニ課題:読み取りだけで調査する

自分のシェルPID、既定経路、TCP待受を順に確認してください。

解答例COMMAND
ps -p $$ -o pid,comm
ip route show default
ss -lnt
記録する 実行日時、コマンド、出力、正常時との差を記録すると、変更せずに原因を絞れます。