サーバーの障害対応で使うコマンド一覧

障害対応(サーバー)のコースで調べる・直すのに覚えるコマンドの一覧です。cd・ls などの基本操作と、ほかのコースで覚えた道具(pwd・cd・ls・ll・mkdir・touch・cp・mv・rm・ln・cat・less・head・tail・echo・grep・wc・sort・uniq・awk・cut・sed・tr・tee・xargs・diff・vi・vim・exit・stat・date・which・hostname・id・whoami・sudo・chmod・chown・chgrp・rpm・dnf・nproc・ping・nmcli・fallocate・mkswap・lsblk・blkid・docker・docker-version・docker-run・docker-rm・docker-stop・docker-images・docker-rmi・docker-build・docker-compose・docker-network・docker-volume・semanage・getenforce・getsebool・setsebool・sestatus)は最初から使えます。

uptime稼働時間と負荷Lv1 で覚える

uptime

load average は直近 1・5・15 分の平均負荷です。

top -b -n 1CPU を使っているプロセスLv2 で覚える

top -b -n 1

負荷の高いプロセスを上から表示します(ここでは 1 回だけ表示)。

freeメモリの使用量Lv3 で覚える

free -h

available が実際に使える量の目安です。

dfディスクの空き容量Lv4 で覚える

df [-h] [-T] [-i] [パス]

-h で読みやすい単位に、-T で種類、-i で inode(ファイルの数の上限)。パスを書くと、そのパスがあるファイルシステムだけ。Use% が 100% に近いと危険です。

journalctlシステムのログを見るLv5 で覚える

journalctl [-u サービス] [-n 行数] [-p err] [-xe] [-k]
journalctl --since '1 hour ago' [--until 時刻]
journalctl -g パターン

-u でサービスを絞り込み、-p err でエラー以上だけ、-xe で末尾を詳しく。--since は today・yesterday・'30 min ago'・'2024-11-01 08:00' などで期間を絞ります。

$ journalctl -u httpd -n 20
$ sudo journalctl -u sshd --since today

dmesgカーネルの記録を見るLv6 で覚える

dmesg [-T] [-x] [--level=err,warn]

ディスクの I/O エラー・メモリ不足でプロセスが止められた(Out of memory)・ネットワークのリンクの切断など、カーネルが出した記録を表示します。-T で時刻を読める形に、--level で重さを絞ります。journalctl -k でも同じ記録が見られます。

$ sudo dmesg -T | tail -20
$ sudo dmesg --level=err,warn

systemctlサービスの起動・停止・自動起動Lv7 で覚える

systemctl start|stop|restart|reload|status サービス
systemctl enable|disable [--now] サービス
systemctl mask|unmask サービス
systemctl is-active|is-enabled サービス
systemctl list-units --type=service [--failed]
systemctl list-unit-files --state=enabled
systemctl reboot / poweroff(reboot・shutdown -r now と同じ)
systemctl default(緊急モードから起動の続き)

start は今すぐ起動、enable は再起動後も自動で起動。enable --now で両方。mask すると手で start しても起動できなくなります。再起動すると、今だけの変更(mount・swapon・setenforce・firewall-cmd の runtime)は消えます。操作には sudo が必要です。

$ sudo systemctl enable --now httpd
$ sudo systemctl disable --now vsftpd
$ systemctl status sshd

nginx -tnginx の設定を確認Lv11 で覚える

nginx -t

設定ファイルの文法をチェックします。

ss待ち受け中のポートと接続Lv12 で覚える

ss -tlnp
ss -ulnp
ss -tnp(つながっている接続)

-t TCP、-u UDP、-l 待ち受け、-n 数値表示、-p プロセス(root のみ)、-a すべて。Local Address が 0.0.0.0 や * なら外から届き、127.0.0.1 ならこのサーバーの中からだけ。netstat の後継です。

$ sudo ss -tlnp
$ sudo ss -tnp

ausearch監査ログを検索Lv14 で覚える

sudo ausearch -m AVC [-ts recent|today|時刻] [-c コマンド名]

/var/log/audit/audit.log から種類(-m)や時刻(-ts)で記録を探します。AVC は SELinux の拒否。scontext(誰が)・tcontext(何を)・tclass(種類)から原因を読み取ります。

$ sudo ausearch -m AVC -ts recent

restorecon / chconSELinux のラベルを直すLv15 で覚える

sudo restorecon -Rv パス
sudo chcon -t タイプ パス

restorecon は場所に応じた正しいラベルに戻します。mv で持ってきたファイルによく使います。

$ sudo restorecon -Rv /var/www/html

duディレクトリの使用量Lv19 で覚える

du [-s] [-h] [--max-depth=N] [パス]

-sh で合計だけを読みやすく。どこが容量を使っているか調べます。

$ sudo du -sh /var/log/*

find条件に合うファイルを探すLv20 で覚える

find [場所] [-name パターン] [-type f|d] [-size +100M] [-mtime +7] [-user 名前] [-exec コマンド {} \;]
find / -perm -4000 -type f(SUID のファイル)
find /etc -newer 基準のファイル

名前・種類・サイズ・更新日・所有者・権限で探せます。-perm -4000 は SUID、-2000 は SGID、/6000 はどちらか。-delete や -exec で見つけたものに処理もできます。

$ find /var/log -name '*.log' -size +100M
$ sudo find / -perm -4000 -type f

lsof開いているファイルとプロセスを見るLv21 で覚える

lsof [ファイル]
lsof +L1
lsof -p PID
lsof -i :ポート

どのプロセスがどのファイルを開いているかを表示します。+L1 は開いたまま消されたファイル((deleted))だけ。rm したのに df が減らないときは、これで持ち主を見つけ、そのサービスを再起動すると空きます。-i :80 は 80 番で待ち受けているプロセスです。

$ sudo lsof +L1
$ sudo lsof /var/log/nginx/access.log
$ sudo lsof -i :80

logrotateログを回す(古いログを残しつつ切り替える)Lv23 で覚える

sudo logrotate -d 設定ファイル(試すだけ)
sudo logrotate -f 設定ファイル(今すぐ回す)
sudo logrotate -v 設定ファイル

設定は /etc/logrotate.conf と /etc/logrotate.d/。主な指示:daily・weekly、rotate 数、compress、missingok、notifempty、create モード 持ち主 グループ、copytruncate、size。

$ sudo logrotate -d /etc/logrotate.d/app
$ sudo logrotate -f /etc/logrotate.d/app

truncateファイルの大きさを変える(空にする)Lv25 で覚える

truncate -s 大きさ ファイル...
truncate -s 0 ファイル

-s 0 で中身を空にします。書き込み中のログは rm すると場所が空かないので、止めずに空けたいときに使います。-s +100M のように + や - で今の大きさから増やす・減らすこともできます。

$ sudo truncate -s 0 /var/log/app/debug.log

curlURL にアクセスLv27 で覚える

curl [-I] [-s] [-o ファイル] URL

Web サーバーの動作確認に使います。-I でヘッダーだけ、-o でファイルに保存。

$ curl http://localhost/
$ curl -I http://localhost:8080/

firewall-cmdファイアウォール(firewalld)の設定Lv29 で覚える

firewall-cmd --state / --get-active-zones / --get-default-zone
firewall-cmd [--zone=ゾーン] --list-all
firewall-cmd --add-service=http|--remove-service=… [--permanent]
firewall-cmd --add-port=8080/tcp [--permanent]
firewall-cmd --zone=trusted --add-source=10.0.0.0/24
firewall-cmd --add-rich-rule='rule family=ipv4 source address=… service name=ssh accept'
firewall-cmd --reload / --runtime-to-permanent

--permanent は設定ファイルにだけ書き、--reload で反映します。--permanent なしは今だけ(--runtime-to-permanent で保存)。送信元(source)を結び付けたゾーンは、その送信元の通信に優先して使われます。

$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --reload

dig / nslookup / hostDNS を引くLv30 で覚える

dig [@サーバー] 名前 [種類] [+short]
dig -x IP アドレス(逆引き)
dig @サーバー ゾーン axfr(ゾーン転送)
host 名前 [サーバー]
nslookup 名前 [サーバー]

resolv.conf の DNS サーバー(@ で指定もできる)に聞きます。/etc/hosts は見ません。種類は A・AAAA・MX・NS・SOA・CNAME・PTR など。flags の aa は「そのゾーンの持ち主が答えた」、status の NXDOMAIN は「その名前は無い」、REFUSED は「断られた」。bind-utils パッケージに入っています。

$ dig +short www.example.com
$ dig @127.0.0.1 guild.lan MX
$ dig -x 10.0.2.20 +short

getent名前の情報を引く(hosts・passwd・group)Lv31 で覚える

getent hosts 名前
getent passwd ユーザー
getent group グループ

hosts は /etc/nsswitch.conf の hosts: の順(files は /etc/hosts、dns は /etc/resolv.conf の DNS サーバー)に引きます。dig は DNS だけを見るので、/etc/hosts の内容は出ません。

$ getent hosts db01
$ getent passwd ec2-user

ipIP アドレス・経路を表示・設定Lv32 で覚える

ip addr(ip a)  ip -4 a  ip -6 a  ip -br a
ip route(ip r)  ip route get 宛先
sudo ip addr add|del アドレス/長さ dev NIC
sudo ip route add|del 宛先/長さ via ゲートウェイ
ip link(MAC アドレス)

ip a でインターフェースとアドレス、ip r で経路を表示します。設定の変更には root が必要です(再起動すると消えます)。

$ ip -br a
$ sudo ip addr add 192.168.10.5/24 dev ens5

tracepath宛先までの通り道(root 不要)Lv33 で覚える

tracepath 宛先

traceroute と同じく、通るルーターを順に出します。reached で宛先に届いたこと、no reply はその先から返事が無いことを表します。

$ tracepath 10.0.3.20

openssl暗号・鍵・証明書の道具Lv34 で覚える

openssl rand -base64|-hex バイト数
openssl enc -aes-256-cbc -pbkdf2 -salt -in 元 -out 暗号文 [-pass file:パスワードのファイル]
openssl enc -d -aes-256-cbc -pbkdf2 -in 暗号文 -out 元
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out 鍵
openssl pkey -in 鍵 -pubout -out 公開鍵
openssl req -new -key 鍵 -out CSR -subj '/CN=名前'
openssl req -x509 -newkey rsa:2048 -nodes -keyout 鍵 -out 証明書 -days 日数 -subj …
openssl x509 -in 証明書 -noout -subject -issuer -dates -fingerprint -checkend 秒
openssl s_client -connect ホスト:443 -servername ホスト
openssl dgst -sha256 ファイル

-pass pass:… はパスワードがコマンドの履歴や ps に残るので、file: や env: を使います。-pbkdf2 を付けないと古い鍵の作り方の警告が出ます。秘密鍵は 600 で作られます。echo | openssl s_client … 2>/dev/null | openssl x509 -noout -enddate で相手の証明書の期限を調べられます。

$ openssl rand -base64 32
$ openssl x509 -in server.crt -noout -enddate
$ echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -subject -dates

psプロセスの一覧Lv37 で覚える

ps aux
ps -ef
ps aux --sort=-%cpu
ps -eZ / ps auxZ(SELinux のドメイン)
ps -o pid,user,cmd -p PID

動いているプログラムと PID・CPU 使用率を表示します。-Z を付けると httpd_t などのドメインも出ます。

$ ps aux --sort=-%cpu | head
$ ps -eZ | grep httpd

kill / pkillプロセスを止めるLv38 で覚える

kill [-9] PID
pkill [-f] 名前

まず kill(SIGTERM)、止まらなければ kill -9(SIGKILL)。

nice / reniceプロセスの優先度(nice 値)Lv39 で覚える

nice -n 値 コマンド
renice -n 値 -p PID
ps -o pid,ni,comm

nice 値は -20(優先)〜 19(控えめ)。重い処理を nice -n 10 で控えめに動かすと、ほかの処理が遅くなりにくくなります。値を下げる(優先度を上げる)のは root だけです。

$ nice -n 10 ./batch.sh &
$ sudo renice -n 5 -p 2400

swapon / swapoffスワップを使う・やめるLv41 で覚える

swapon --show(一覧)
sudo swapon デバイス|ファイル
sudo swapon -a(fstab のものを全部)
sudo swapoff デバイス|ファイル

fstab には「UUID=… none swap defaults 0 0」と書きます。free -h の Swap: の行でも確かめられます。

$ sudo swapon /swapfile
$ swapon --show

ulimit使える資源の上限Lv42 で覚える

ulimit -a
ulimit -n(開けるファイルの数)
ulimit -u(プロセスの数)
ulimit -Sn / -Hn(ソフト / ハード)
ulimit -n 数

ソフトの上限はハードまで自分で上げ下げできますが、ハードを上げられるのは root だけ。利用者ごとの上限は /etc/security/limits.conf(と limits.d)に「ドメイン 種類 項目 値」で書き、次のログインから効きます。

$ ulimit -a
$ sudo su - alice -c 'ulimit -u'

crontab定期実行の設定Lv43 で覚える

crontab -l
crontab ファイル
(crontab -l; echo '0 3 * * * コマンド') | crontab -
crontab -r

分 時 日 月 曜日 コマンド の順に書きます。cronie パッケージと crond サービスが必要です。

$ echo '*/5 * * * * /home/ec2-user/check.sh' | crontab -

docker psコンテナの一覧Lv45 で覚える

docker ps
docker ps -a
docker ps -q
docker ps --format '{{.Names}} {{.Status}}'
docker port コンテナ

動いているコンテナを表示します。-a で止まったものも、-q で ID だけ。STATUS の Up は動作中、Exited (n) は終了コード n で止まった状態。

$ docker ps -a

docker logsコンテナの出力を見るLv46 で覚える

docker logs コンテナ
docker logs --tail 20 コンテナ
docker logs -t コンテナ

コンテナのプログラムが標準出力・標準エラーに出したものを表示します。動かないコンテナの原因探しの第一歩。

$ docker logs web

docker inspect詳しい情報を見るLv47 で覚える

docker inspect 名前
docker inspect -f '{{.State.Status}}' コンテナ
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' コンテナ

コンテナ・イメージ・ネットワーク・ボリュームの設定と状態を JSON で表示します。-f で必要なところだけ取り出せます。

$ docker inspect -f '{{.State.ExitCode}}' web

docker exec動いているコンテナで実行Lv49 で覚える

docker exec コンテナ コマンド
docker exec -it コンテナ sh
docker exec -e KEY=値 -w ディレクトリ -u ユーザー コンテナ コマンド

動いているコンテナの中でコマンドを実行します。-it で中のシェルに入り、exit で戻ります(コンテナは動いたまま)。

$ docker exec -it web sh
$ docker exec web cat /etc/nginx/conf.d/default.conf

docker system / prune片付けるLv51 で覚える

docker system df
docker container prune -f
docker image prune [-a] -f
docker volume prune -f
docker system prune [-a] [--volumes] -f

使っていないコンテナ・イメージ・ネットワーク・ボリュームをまとめて消します。-f を付けないと確認を求められます。df で使っている容量を確かめます。

$ docker system df
$ docker image prune -f

mountファイルシステムをつなぐLv53 で覚える

sudo mount デバイス マウントポイント
sudo mount -t 種類 -o オプション デバイス マウントポイント
sudo mount UUID=… / LABEL=… マウントポイント
sudo mount マウントポイント(fstab から)
sudo mount -a(fstab のものを全部)
sudo mount -o remount,rw マウントポイント
mount -t xfs(一覧)

マウントポイント(空のディレクトリ)にファイルシステムをつなぎます。つないでいる間、元のディレクトリの中身は隠れます。fstab を書き換えたら systemctl daemon-reload を。XFS のスナップショットは -o nouuid が要ります。

$ sudo mount /dev/sdb1 /data
$ sudo mount -a

findmntマウントの一覧・fstab の点検Lv54 で覚える

findmnt [マウントポイント|デバイス]
findmnt -t xfs
findmnt -s(fstab の中身)
sudo findmnt --verify(fstab の誤りを探す)

マウントを木の形で出します。--verify は fstab の書き間違い(無いデバイス・種類の違い・無いマウントポイント)を [E]・[W] で教えてくれます。再起動の前に必ず。

$ findmnt /data
$ sudo findmnt --verify

timedatectlタイムゾーン・時刻の設定Lv55 で覚える

timedatectl
sudo timedatectl set-timezone Asia/Tokyo

サーバーのタイムゾーンを日本時間にするときに使います。

chronycchrony(時刻合わせ)の状態Lv56 で覚える

chronyc sources [-n]
chronyc tracking
sudo chronyc makestep

sources の ^* が今合わせている相手、^? は届いていない相手。相手は /etc/chrony.conf の server・pool で決め、変えたら systemctl restart chronyd で読み込ませます。

$ chronyc sources
$ chronyc tracking