ファイル
Copy $ du -sh * | sort -h -r
Copy $ while true; do sleep 1; echo hello; done
Copy $ sudo ionice -c 2 -n 7 nice -n 19 du -scm /* | sort -rn
/proc/
OS内で動作するすべてのプロセスにおけるinotify watch数を把握
Copy $ ls -l /proc/*/fd/ | grep inotify | wc -l
プロセス
Copy $ pkill -f /bin/sh
$ ps auxww | grep /bin/sh | awk '{print $2}' | xargs kill
バージョン
Copy $ cat /etc/redhat-release
Copy $ sudo ls -l /proc/2676/fd
ls系
dmidecode
Copy $ dmidecode -t system
Copy $ dmidecode -t processor
Copy $ dmidecode -t memory
パフォーマンス
監査
auditd
/etc/audit/rules.d/audit.rules
ファイルの末尾に、以下の行を追加しOSを再起動
Copy -a entry,always -F arch=b64 -S kill -k MyKillTrace
以後、/var/log/audit/audit.log
にkillシステムコールを呼び出したプロセスの情報が記録される。以下のようにコマンドで対象のプロセスが発行したkillシステムコールをログに出力。
Copy # strace -fttvo ログファイル名 -s 1000 -e kill -p プロセスID
ネットワーク
General
Copy $ vmstat 5
$ sar -p 5
Copy $ top -H -b -n1 | head -15
接続性
Copy $ sudo traceroute -T -p 443 192.168.0.1
Copy $ sudo nping 192.168.0.1 --tcp -p 443 -c 30
Copy $ mtr --report -c 100 --no-dns github.com
コマンド別
netstat
LISTEN/ESTABLISHEDの状態(Openな接続)確認
Copy $ netstat -nA inet | awk '/^[ut]/{split($5,a,:);print a[1]}'|sort |uniq -c |sort -n > ip-2.txt
IPv6
Copy $ netstat -nA inet6 | awk '{print $5}' | sed s/::ffff:// | cut -d: -f1 | sort | uniq -c | sort -n > ip6-2.txt
ss
Copy $ ss state time-wait | wc -l
curl
Copy $ curl -v -s www.google.com > /dev/null
$ curl -v -so /dev/null www.google.com
Copy $ curl -v -s -H Host: www.google.com clb.test.hayashier.com > /dev/null
Copy $ curl -s -o /dev/null -w %{time_total} http://www.google.com
Copy $ 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.com
Copy $ curl --request POST 'http://www.google.com' --data hoge=fuga
動画ファイルのPOST
Copy $ curl -v -F video=@Downloads/test.mp4 -X POST http://test.hayashier.com
Copy $ curl -v --cookie HOGE=FUGA http://clb.test.hayashier.com
Copy $ curl -IsSv <FQDN> 2>&1 | grep Trying
Copy $ IsError=false; while [ $IsError != true ]; do curl -I -k <URL> 2>&1 | tee error.out | grep HTTP/1.1 ; done;
スリープ付き
Copy $ IsError=false; while [ $IsError != true ]; do sleep .5; (time curl -I -k <URL>) 2>&1; done;
連続でリクエスト送信時のステータスコードと処理時間
Copy $ while true; do curl -s -o /dev/null -w HTTPCode=%{http_code} TotalTime=%{time_total}\n http://www.google.com; done
Copy $ while true; do curl -I -L http://www.google.com/; sleep 5; done
Copy $ curl --http2 -I https://twitter.com
Copy $ curl -v -H 'TEST: '$(perl -e 'print 0x16376') http://test.hayashier.com
表示項目 カスタマイズ 以下の内容を curl-format.txt として保存。
Copy \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
Copy $ 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
Copy $ 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; done
dig
Copy $ dig +short +noall +answer alb.test.hayashier.com | xargs -L 1 curl -vG 2>&1 >/dev/null | awk '/^(< HTTP|> Host)/ { print $3 }'
Copy $ for j in `dig +short ns github.com.`; do dig @$j +short api.github.com.; done
OpenSSL
Copy $ openssl s_client -connect clb.test.hayashier.com:443
GET / HTTP/1.1
Copy $ openssl s_client -showcerts -connect <host>:<port> < /dev/null
Copy $ openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect clb.test.hayashier.com:443
Netcat
Copy $ 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
Copy $ nc localhost 1234 -v
Connection to localhost 1234 port [tcp/search-agent] succeeded!
Hi
World
Copy $ while true ; do echo -n $(date): ; nc -vz api.github.com 443; sleep 2; done
Copy $ date --date='@1527718243'
Thu May 31 07:10:43 JST 2018
Others
低レイヤー
strace
ps aux
で対象プロセスのPID
よりプロセスIDを確認して、-p
オプションで指定して動きをトレース
例えば、Nginxのworkerのネットワーク関連にシステムコールの動きをトレースする場合は以下のように実行
Copy $ sudo strace -p 5 -e trace=network
問題発生時に書くシステムコールで要した時間を確認したい場合は、以下のように実行
-o FILE_NAME
で結果を指定したファイルに出力
Copy $ sudo strace -T -tt -e trace=all -p 460 -o output.txt
gdb
実行プロセスのコードを追う
Copy $ 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
に変更しておくとよいでしょう。
負荷テスト
Copy $ h2load -n 10000 -c 10 -m 10 -v -p h2c https://test.hayashier.com
$ ab -n 10000 -c 10 -k https://test.hayashier.com
Copy $ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench
実行方法
Copy $ sysbench --test=cpu run
パケットキャプチャ
Copy $ sudo tcpdump -w sample.pcap
sample.pcapというpcapファイルを読み込み(-rオプション)、DNSに変換せずに(-nオプション)、srcかdstのホストIPがxxx.xxx.xxx.xxxかつTCPポート80番
Copy $ tcpdump -r sample.pcap host xxx.xxx.xxx.xxx and tcp port 80 -n
sample.pcapというpcapファイルを読み込み(-rオプション)、DNSに変換せずに(-nオプション)、srcのホストIPがxxx.xxx.xxx.xxxかつdstのホストIPがyyy.yyy.yyy.yyyかつTCPポート80番
Copy $ tcpdump -r sample.pcap ip dst xxx.xxx.xxx.xxx and ip src yyy.yyy.yyy.yyy and tcp port 80 -n
Wireshark
Copy 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/
カーネルソースコード入手
Copy # 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 virt
Yumレポジトリ中のrpmの中のJavaを確認
Copy # 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 IntelliJ
screen
Copy 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には以下の設定を追加。
Copy 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@
ディスク容量いっぱい
不要ファイルの洗い出し
キャッシュ周りやデプロイ毎に作成されるファイルで、古いものが残っている等の類のものを優先的に見ていく。
Copy $ du -sh * | sort -h -r
$ du --max-depth 5 -h * | sort -h -r
yumのキャッシュを確認
Copy du -sh /var/cache/yum
前者で十分な事が多いが、容量がいっぱいだと、前者のコマンドも容量不足で実行できないことがある。その場合後者を実行すれば良い。
Copy yum clean all
rm -Rf /var/cache/yum
BPF
その他
Unix時間を変換
Copy $ date -ud '@1589500800'
2020年 5月 15日 金曜日 00:00:00 UTC
MacOSでは以下
Copy $ date -ur 1589500800
2020年 5月15日 金曜日 00時00分00秒 UTC
10進数へ変換
2進数
16進数
ALBで502生成
Copy $ sudo iptables -A INPUT -s 192.168.0.10 -p tcp --dport 80 -j REJECT --reject-with tcp-reset
macOS
ターミナル
VSCode
マークダウン表示
参考資料
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 コマンド例 まとめ
参照
コマンドで覚えるLinux 単行本 – 2016/10/12 一戸 英男 (著)
https://www.amazon.co.jp/dp/4802610327