サーバーの障害対応で使うコマンド一覧
障害対応(サーバー)のコースで調べる・直すのに覚えるコマンドの一覧です。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}}' webdocker 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