よく使うトラブルシューティング コマンド実行例 まとめ
ファイル
ファイル名検索
$ find ./ -name hoge任意のファイルから特定文字列を検索
$ grep -r hoge ./ファイルサイズが大きい順に表示
$ du -sh * | sort -h -r1秒おきにコマンド継続実行
$ while true; do sleep 1; echo hello; doneディスク使用量確認
$ sudo ionice -c 2 -n 7 nice -n 19 du -scm /* | sort -rnパーティション毎のディスク使用量確認
$ df -Thメモリ使用量
$ free -mSwapサイズ
$ swapon -s/proc/
CPU情報、コア数など
$ less /proc/cpuinfoメモリ使用内訳
$ less /proc/meminfoOS内で動作するすべてのプロセスにおけるinotify watch数を把握
$ ls -l /proc/*/fd/ | grep inotify | wc -lプロセス
プロセス数を確認
$ ps auxww使ってるファイルのプロセスを調べる
$ lsof -p PID番号/bin/shで動いてるプロセスを全て停止する
$ pkill -f /bin/sh
$ ps auxww | grep /bin/sh | awk '{print $2}' | xargs killバージョン
OSバージョン
$ cat /etc/redhat-releasekernelバージョンを調べる
$ uname -aパッケージの確認
$ rpm -qaプロセスが掴んでいるファイル一覧
$ sudo ls -l /proc/2676/fdプロセス内のスレッドの数
$ ps aux -L稼動しているプロセスを検索
$ pgrep -l syslogプロセスの親子関係
$ pstreels系
PCI バスとそこにつながっているデバイス
$ lspciCPUの情報
$ lscpuブロックデバイスのリスト
$ lsblkロードされているカーネルモジュール
$ lsmoddmidecode
システムの情報、型番等
$ dmidecode -t systemBIOS の情報
$ dmidecode -t biosCPU の情報
$ dmidecode -t processorメモリの情報
$ dmidecode -t memoryパフォーマンス

References
監査
auditd
/etc/audit/rules.d/audit.rulesファイルの末尾に、以下の行を追加しOSを再起動
-a entry,always -F arch=b64 -S kill -k MyKillTrace 以後、/var/log/audit/audit.log にkillシステムコールを呼び出したプロセスの情報が記録される。以下のようにコマンドで対象のプロセスが発行したkillシステムコールをログに出力。
# strace -fttvo ログファイル名 -s 1000 -e kill -p プロセスIDネットワーク
General
CPU使用率
$ vmstat 5
$ sar -p 5特定のユーザーが使用しているCPU使用率
$ top -u oracleCPU使用率 Top15
$ top -H -b -n1 | head -15ディスクI/O使用率
$ vmstat -d接続性
traceroute
$ sudo traceroute -T -p 443 192.168.0.1Nping
$ sudo nping 192.168.0.1 --tcp -p 443 -c 30MTR
$ mtr --report -c 100 --no-dns github.comコマンド別
netstat
TCPの接続状態確認
$ netstat -lanptLISTEN/ESTABLISHEDの状態(Openな接続)確認
$ netstat -anネットワークに正常にパケットが送受信できているか
$ netstat -i接続元のユニークなIP IPv4
$ netstat -nA inet | awk '/^[ut]/{split($5,a,:);print a[1]}'|sort |uniq -c |sort -n > ip-2.txtIPv6
$ netstat -nA inet6 | awk '{print $5}' | sed s/::ffff:// | cut -d: -f1 | sort | uniq -c | sort -n > ip6-2.txtss
オープンな接続数の調査
$ ss -a | wc -lTCPのみフィルタリング
$ ss -t | wc -lTCPの状態でフィルタリング
$ ss state time-wait | wc -lcurl
ヘッダーだけ表示
$ curl -v -s www.google.com > /dev/null
$ curl -v -so /dev/null www.google.comヘッダー指定
$ curl -v -s -H Host: www.google.com clb.test.hayashier.com > /dev/null時間測定
$ curl -s -o /dev/null -w %{time_total} http://www.google.com詳細時間表示
$ curl -w %{remote_ip} time_namelookup: %{time_namelookup} tcp: %{time_connect} ssl:%{time_appconnect} start_transfer:%{time_starttransfer} total:%{time_total}\n -sk -o /dev/null http://www.google.comPOSTメソッド
$ curl --request POST 'http://www.google.com' --data hoge=fuga動画ファイルのPOST
$ curl -v -F video=@Downloads/test.mp4 -X POST http://test.hayashier.comCookie 送信
$ curl -v --cookie HOGE=FUGA http://clb.test.hayashier.comラウンドロビンDNSの調査
$ curl -IsSv <FQDN> 2>&1 | grep Tryingレスポンスコード調査し続ける
$ IsError=false; while [ $IsError != true ]; do curl -I -k <URL> 2>&1 | tee error.out | grep HTTP/1.1 ; done;スリープ付き
$ IsError=false; while [ $IsError != true ]; do sleep .5; (time curl -I -k <URL>) 2>&1; done;連続でリクエスト送信時のステータスコードと処理時間
$ while true; do curl -s -o /dev/null -w HTTPCode=%{http_code} TotalTime=%{time_total}\n http://www.google.com; done5秒おきにリクエスト送信時のヘッダー情報
$ while true; do curl -I -L http://www.google.com/; sleep 5; doneHTTP/2でテスト
$ curl --http2 -I https://twitter.comスクリプトと合わせてテスト
$ curl -v -H 'TEST: '$(perl -e 'print 0x16376') http://test.hayashier.com表示項目 カスタマイズ 以下の内容を curl-format.txt として保存。
\n
Timing:\n
DNS Resolution Time: %{time_namelookup}\n
TCP Handshake: %{time_connect}\n
SSL Handshake: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect: %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
---------------------------------------------\n
Total Time spent: %{time_total}\n
\n
HTTP Details:\n
HTTP Status Code: %{http_code}\n
Request Size: %{size_request}\n
\n
$ curl -w '@curl-format.txt' -L https://google.com -so /dev/null
Timing:
DNS Resolution Time: 0.030453
TCP Handshake: 0.044017
SSL Handshake: 0.087345
time_pretransfer: 0.087440
time_redirect: 1.848814
time_starttransfer: 0.331126
---------------------------------------------
Total Time spent: 3.383122
HTTP Details:
HTTP Status Code: 200
Request Size: 152ネームサーバ 接続テスト
$ while true; do curl --connect-timeout 5 -o /dev/null -Ssk -H Host: api.github.com https://192.30.255.116/ && echo ok; sleep 1; donedig
ELBノード毎のレスポンスのHTTPステータス
$ dig +short +noall +answer alb.test.hayashier.com | xargs -L 1 curl -vG 2>&1 >/dev/null | awk '/^(< HTTP|> Host)/ { print $3 }'ネームサーバ IP 列挙
$ for j in `dig +short ns github.com.`; do dig @$j +short api.github.com.; doneOpenSSL
接続テスト
$ openssl s_client -connect clb.test.hayashier.com:443
GET / HTTP/1.1証明書詳細
$ openssl s_client -showcerts -connect <host>:<port> < /dev/null暗号スイート指定
$ openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect clb.test.hayashier.com:443 Netcat
クライアント/サーバ間通信
$ nc -v -l -k 1234
Connection from 127.0.0.1 port 1234 [tcp/search-agent] accepted
Hi
World
Connection from 127.0.0.1 port 1234 [tcp/search-agent] accepted
GET / HTTP/1.1
Host: localhost:1234
User-Agent: curl/7.51.0
Accept: */*
Connection from 127.0.0.1 port 1234 [tcp/search-agent] accepted
POST / HTTP/1.1
Host: localhost:1234
User-Agent: curl/7.51.0
Accept: */*
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
hoge=fuga$ nc localhost 1234 -v
Connection to localhost 1234 port [tcp/search-agent] succeeded!
Hi
World接続状態監視
$ while true ; do echo -n $(date): ; nc -vz api.github.com 443; sleep 2; done時刻変換
$ date --date='@1527718243'
Thu May 31 07:10:43 JST 2018Others
低レイヤー
strace
ps auxで対象プロセスのPIDよりプロセスIDを確認して、-pオプションで指定して動きをトレース例えば、Nginxのworkerのネットワーク関連にシステムコールの動きをトレースする場合は以下のように実行
$ sudo strace -p 5 -e trace=network問題発生時に書くシステムコールで要した時間を確認したい場合は、以下のように実行
-e trace=xxxxで指定した-ttでusecでタイムスタンプを絶対時間で表示-Tで各システムコールで要した時間-o FILE_NAMEで結果を指定したファイルに出力$ sudo strace -T -tt -e trace=all -p 460 -o output.txt
gdb
実行プロセスのコードを追う
$ gdb -p `ps aux | grep redis-server | grep -v grep | awk '{print $2}'`Tips
ブレークポイントを打つ点は、
btコマンドでデバッグトレースを確認し、毎回通過する関数などを観察すると良い(Redisの場合は、processCommand)。
※Redisサーバーをデバッグするためには、手動でビルドする必要があります。その際、make CFLAGS="-g "のように実行しておく必要があります。適宜MakefileのOPTIMIZATION?の値で-O2から-O0に変更しておくとよいでしょう。
負荷テスト
$ h2load -n 10000 -c 10 -m 10 -v -p h2c https://test.hayashier.com
$ ab -n 10000 -c 10 -k https://test.hayashier.comsysbench インストール
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench実行方法
$ sysbench --test=cpu runパケットキャプチャ
取得
$ sudo tcpdump -w sample.pcapフィルター例
sample.pcapというpcapファイルを読み込み(-rオプション)、DNSに変換せずに(-nオプション)、srcかdstのホストIPがxxx.xxx.xxx.xxxかつTCPポート80番
$ tcpdump -r sample.pcap host xxx.xxx.xxx.xxx and tcp port 80 -nsample.pcapというpcapファイルを読み込み(-rオプション)、DNSに変換せずに(-nオプション)、srcのホストIPがxxx.xxx.xxx.xxxかつdstのホストIPがyyy.yyy.yyy.yyyかつTCPポート80番
$ tcpdump -r sample.pcap ip dst xxx.xxx.xxx.xxx and ip src yyy.yyy.yyy.yyy and tcp port 80 -nWireshark
フィルター例
http.request and http contains Root=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # ALBにおけるアクセスログとキャプチャの関連付け
http.response.code == 502
tcp.flags.reset == 1
ip.addr == 10.0.0.1 && tcp.flags.fin
ip.src == 10.0.0.1 or ip.src == 10.0.0.2
ip.dst == 10.0.0.1
eth.src [0:3] == 00:00:83
tcp.port in {443, 80, 8080}Command Gでパケット番号による検索。
フィルター詳細 https://www.wireshark.org/docs/dfref/
カーネルソースコード入手
# yumdownloader --source kernel
Loaded plugins: auto-update-debuginfo, priorities, update-motd, upgrade-helper
Enabling ius-source repository
Enabling amzn-updates-source repository
Enabling amzn-main-source repository
31 packages excluded due to repository priority protections
kernel-4.9.93-41.60.amzn1.src.rpm | 136 MB 00:00:03
# rpm2cpio kernel-4.9.93-41.60.amzn1.src.rpm | cpio -id
1363606 blocks
# tar -xf linux-4.9.93.tar
# ls linux-4.9.93/
arch certs CREDITS Documentation firmware include ipc Kconfig lib Makefile net REPORTING-BUGS scripts sound usr
block COPYING crypto drivers fs init Kbuild kernel MAINTAINERS mm README samples security tools virtYumレポジトリ中のrpmの中のJavaを確認
# Get rpm from Yum repository
$ wget <HTTPS URL for rpm in Yum repos>
# Decompress rpm file
$ rpm2cpio aws-hm-client-4.2.0-1.amzn2023.noarch.rpm | cpio -id
# Decompress jar file
$ cd usr/share/aws/hmclient/lib
$ jar xf aws-glue-datacatalog-client-common-4.2.0.jar
# Open .class file with IntelliJscreen
Ctrl+a c : ウィンドウ新規作成
Ctrl+a w : ウィンドウ一覧
Ctrl+a num : ウィンドウ切り替え
Ctrl+a a : ウィンドウ間の行き回
Ctrl+a [ : スクロールモード
Ctrl+a d : セッションをデタッチ
exit: セッションを終了
Ctrl+a S : 画面垂直分割(リージョン分割)
Ctrl+a tab : リージョン切り替え
Ctrl+a x : リージョン削除
作業再開時 : screen -r [Session ID]
指定した名前でセッション新規作成 : screen -S [Session ID]
セッション一覧 : screen -ls
セッション終了 : screen -XS <Session ID> kill
Copy & Paste : Ctrl + [ , Ctrl + ].screenrcには以下の設定を追加。
defscrollback 10000 # スクロールバッファを10000行に設定
# ステータスライン設定
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
# マウス操作を有効化
mousetrack on
termcapinfo xterm* ti@:te@ディスク容量いっぱい
不要ファイルの洗い出し
キャッシュ周りやデプロイ毎に作成されるファイルで、古いものが残っている等の類のものを優先的に見ていく。
$ du -sh * | sort -h -r
$ du --max-depth 5 -h * | sort -h -ryumのキャッシュを確認
消すものがさくっとでてこないときにとりあえず
du -sh /var/cache/yum前者で十分な事が多いが、容量がいっぱいだと、前者のコマンドも容量不足で実行できないことがある。その場合後者を実行すれば良い。
yum clean all
rm -Rf /var/cache/yumBPF
その他
Unix時間を変換
$ date -ud '@1589500800'
2020年 5月 15日 金曜日 00:00:00 UTCMacOSでは以下
$ date -ur 1589500800
2020年 5月15日 金曜日 00時00分00秒 UTC10進数へ変換
2進数
$ echo $((2#101))16進数
$ echo $((16#afaf))ALBで502生成
$ sudo iptables -A INPUT -s 192.168.0.10 -p tcp --dport 80 -j REJECT --reject-with tcp-resetmacOS
ターミナル
VSCode
マークダウン表示
Command + k -> v
画面分割して表示
Command + Shift -> v
別タブで表示
参考資料
https://qiita.com/sion_cojp/items/04a2aa76a1021fe77079
https://qiita.com/taiyop/items/bfeeb41259cb0d083d88#_reference-dfefbef0995e80f8203e
https://qiita.com/ngyuki/items/0edecb8b92fcf189ac2b
http://saosao-0706.hatenablog.com/entry/2016/04/21/101656
https://qiita.com/rsooo/items/42f0902d42bab6ecf175
https://qiita.com/tksnino/items/300e39279ca57d9515f2#_reference-f0f5976f3c0d65c5026c
https://qiita.com/hiro-d/items/c3f724cb3d377e21cd91
https://linuxize.com/post/how-to-use-linux-screen/
https://qiita.com/hnishi/items/3190f2901f88e2594a5f
https://unix.stackexchange.com/questions/26685/how-to-split-window-vertically-in-gnu-screen
https://support.apple.com/ja-jp/guide/terminal/trmlshtcts/mac
Linux コマンド例 まとめ
apt-cache
apt-chrom
apt-get
arp
chkconfig
createuser
crontab
df
dig
dmesg
dmidecode
dpkg
expect
fdisk
fio
firewall-cmd
firewalld
free
fsck
gcc
gdb
grep
hdparm
host
ifconfig
insmod
iostat
iotop
ip
iptables
journalctl
kill
limit
lshw
lsmod
lspci
lsusb
lspci
lsusb
ltrace
lvcreate
lvextend
lvreduce
mkfs
mkswap
modprobe
mount
mtr
netstat
nmtui
nslookup
ntpq
ntpdate
parted
pidof
ping
postfix
postqueue
postsuper
pstree
resize2fs
rmmod
route
rsync
sar
screen
script
service
smartctl
snmpwalk
ss
strace
swapon
sysctl
systemctl
tail
tcpdump
top
traceroute
ulimit
uptime
vgcreate
vgrename
vgextend
w
watch
yum
参照
コマンドで覚えるLinux 単行本 – 2016/10/12 一戸 英男 (著)
https://www.amazon.co.jp/dp/4802610327
Last updated