どうも!最近Minecraftにハマっている@g_ryotaroです。
無心で整地を行うことがとても楽しい
今年サーバーの保守・運用に片足と片腕をつっこんだ新卒2年目がほんとにお世話になったなと思うコマンドをまとめてみようと思います。
Linuxコマンドって目的にあったもの探すの難しいですよね〜
僕もscreenコマンドやwatchコマンドなんて、多分教えていただかなければ見つけられなかったと思います。
この記事は自分がそれらのコマンドをどうゆう時に使ってるか、よく使うイディオム等を紹介していきます。
来年からサーバーサイド触るんだけど、なんかどうしたらいいのかわからない、とか
俺もサーバー触ってるよ的な人の参考になれば幸いです。
もろもろ関係ある環境
- AWS
- Amazon Linux(CentOS)
- MacOS X
- Nginx
- Ruby on Rails
- Node
- docker
- mongodb
- mysql
- postgresql
cd
言わずと知れたディレクトリを移動するためのコマンドです。
通常の使用だと
$ cd ~/2017
よろしく2017年
cdは指定したディレクトリに移動します。
最近知った便利なオプションは、アドベントカレンダーの記事で先輩が紹介してくださった
$ cd -
直前まで自分が居たディレクトリに戻れます。
これで間違って長いディレクトリ移動をしてもやり直せるぜ!!
df
ディスクの使用状況を出力してくれます。
$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1 465Gi 71Gi 393Gi 16% 1532905 4293434374 0% /
devfs 182Ki 182Ki 0Bi 100% 630 0 100% /dev
map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home
よく使うオプションは-hや-iです。
-h
人が読みやすいように適当な単位に変換してくれます。lsとかでも-h使うとファイルの容量みやすくなったりします。
-i
iノードの使用量を出してくれるようになります。
npm installとかする&デプロイした時の古いディレクトリがいくつか残ってる。
そんな状態で、突如サーバーの調子が悪くなったときはiノードが枯渇してるかもしれません。
df -hで特に問題なくてもdf -ihでiノードが一杯というときも。。。
du
ディスク一杯になっちゃった〜〜てへぺろ
ってなる前にディスク容量を食いつぶしているファイルを確認してみてはいかがでしょうか??
本番稼働サーバーでディスクフルなってしまうと、最高のストレスを味わえます。sshできなくなったりするしw
$ sudo du -sh /*
8.8G /Applications
1.7G /Library
0B /Network
7.8G /System
39G /Users
$ sudo du -sh /Users/*
掘り進めていく...
そこそこ時間のかかるコマンドなので、エラー通知が時々くらいの、余裕ある時に試しておいた方がいいです。
sortに渡す時は-hオプションを付けないように気をつけてください。
単位が揃わなくて正確な結果が得られないです。
grep
一番のお気に入りgrepです。僕はパイプでめちゃめちゃ使います。
文字列を検索したりするのに使うコマンドです
$ ls | grep sample #=> sampleって入ってるディレクトリ&ファイルを出力
docker-sample/
docker-sample2/
docker-sample3/
js_samples/
-v
$ ls | grep -v sample #=> sampleって入ってないディレクトリ&ファイルを出力
-e
$ ls | grep -e "sa*" #=> 正規表現で引っかかるファイル&ディレクトリを出力
ログ・ファイルの中から気になる箇所だけ抜き出したり、後述するtail -f と組み合わせて目的の出力だけ確認したりとかにも使ったりします。(そっちの方が多いかな??)
history
これは単語のまま、実行したコマンドの履歴をみることができます。
あのコマンドなんだっけなーとか、どんなコマンド実行して対応したんだろ?とかをこっそり確認できたりします。
$ history
1036 ls | grep -e "sa*"
1037 ls | grep -ve "sa*"
1038 tail -f | grep test
数字を引数に与えると、その個数分遡れたりします。
Ctrl + Rとかでも過去に使ったコマンドを遡れるのですが、自分はhistory | grep psqlとか実行してコマンドを再度使ったりしています。
ls
ファイルやディレクトリの一覧を見れるやつですね(実は一冊の本になるくらい奥が深い...)
$ ls
sample sample2 sample3
-l
ファイルの権限周りの確認や容量、シンボリックリンクの参照先などファイルについてより詳細を知りたい場合は-l
$ ls -l
total 8
drwxrwxr-x 2 ec2-user ec2-user 4096 Dec 20 18:04 sample
drwxrwxr-x 2 ec2-user ec2-user 4096 Dec 20 18:05 sample2
-rw-rw-r-- 1 ec2-user ec2-user 0 Dec 20 18:05 sample3
-a
隠しファイルをチェックしたいときに使います。
$ ls -a
. .bash_history .bash_profile .nvm sample sample3
.. .bash_logout .bashrc .ssh sample2
う〜ん。あまり使わないかな?
lsof
開いてるプロセスの情報を出力します
dockerを触るときにたまに使います。
ローカル環境でmongodを起動している状態で、さらにmongodbのコンテナを立ち上げちゃってしかも同じポート(27019)に紐付けようとして怒られたとき
$ lsof -i :27019
でPIDを確認してkillしちゃいます。
rm
ファイルやディレクトリを削除するコマンドです(なので実行するときは注意してください!)
$ rm sample.html
-r
ディレクトリを削除する時に使います。中のファイルたちももちろん削除されます。
$ rm -r sample
-f
普通にrmを使おうとすると削除する時に警告が出る端末もあります。
それが再帰的な削除だったら、yを死ぬほど連打しなければなりません。
-fは警告を出なくしてくれます。
$ rm -rf 2016
さよなら、2016年
ps
もう必需品ですね。実行中のプロセスを表示します。
$ ps auxf | grep unicorn
正直オプションとか考えずにイディオムみたいに使っています。
一応それぞれのオプションは
-a
別ユーザーのプロセス表示
-u
ユーザー名と開始時刻表示
-x
制御端末のないプロセスも表示
-f
プロセスの親子関係をツリーで表示してくれる
なるほど、勉強になります。
なぜかpsコマンドはハイフンつけずにオプション宣言するのがくせになってます。
☆screen
今年1番感動したコマンド
ネットが切れて実行中のバッチやフォアグラウンドで動くDynamodbローカルが止まると困るから、PC前にかじりついていた昔の自分に教えてあげたい。
$ ssh host
$ screen #=> セッションを作る
$ bundle exec rails runner "Batch::HyperGreatSpecialProgram.execute" #=>時間がかかる処理
$ <Ctrl + a> + d #=> デタッチ
ここでsshを切ってもOK
$ ssh host
$ screen -ls #=> PIDが出てくる
$ screen -r PID
$ 復活!!!
ネットが切れても大丈夫なのはすごくうれしい。
さっきまで勢い良く流れていたログが止まってしまい、涙したあの日を僕は忘れません
top
とりあえずビール的なノリで、調子の悪いサーバーに入ったら起動します。
$ top
[ec2-user@ip-172-31-3-203 ~]$ top
top - 20:30:45 up 10:27, 1 user, load average: 0.00, 0.01, 0.02
Tasks: 82 total, 1 running, 81 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3858732k total, 262880k used, 3595852k free, 49344k buffers
Swap: 2097148k total, 0k used, 2097148k free, 118016k cached
サーバーにどれくらい負荷がかかっているか、全体像を確認できます。
よく確認するのはLoad Averageです。(左から1分、5分、15分間の計算値を表しています)
cpuのコア数よりも高くなってたら、ちょっとやばそうな所を探してみたりします。
大体下の部分に各プロセスが使用しているリソースが表示されているので、それを見ながら当りをつけていきます。
そこから各サービスの状態監視ツールにバトンタッチします。
ログだったり、mongotop, mongostatだったりです
tail
ひたすらたまり続けるlogファイルをチェックするにはtailコマンドを使いましょう
本来はファイルの末尾を表示するためのコマンドのようですがfオプションで更新される内容を吐き出し続けることができます。
-f
$tail -f log/unicorn_production.log
hogehogehogehogehogehogehogehoge
hogehogehogehogehogehogehogehoge
hogehogeehogefuga...
wc
こちらもパイプで使います。
ログの該当箇所がどれくらいあるかカウントしたり
$ cat td-agent.log | grep -e "1234567" | wc
72432 73177 6522301
左から行数、単語数、byte数です。
iノードが枯渇した時にファイルの個数を数えたり
$ find . -type f | wc
72432 73177 6522301
-l
行数だけ出力することができます
★watch
今年2番目に知ってよかったなと思ったwatchコマンドです。
同じコマンドを一定の時間で繰り返し実行
プロセスが立ち上がったか確認する時、皆さんは何を使いますか?
以前の僕はps aux | grep unicornをいい感じのタイミングで実行してよしよし立ち上がってるな
みたいにしてたんですけどwatchを知ってからは
$ watch -n1 "ps aux | grep unicorn"
1秒間隔でコマンドを実行してくれるんです
プロセスが立ち上がっていく様子が見れたりします。安心ですね
他にもfluentdのファイルバッファが適切に処理され、削除されているかどうかも確認してたりしました。
$ watch -n1 "ls"
buff-hogehogehoge
buff-fugafugafuga
xargs
最後になんでもこいのxargs
ループなんてしなくても、同じ処理をファイルに加えたりできます
よく使うのは
$ ls | grep fuga | xargs rm -rf
削除したいディレクトリやファイルをgrepを使って抜き出し、それぞれにrm -rfを適用していきます。
rm自体にも正規表現でいい感じに空気を読んで、マッチしたファイルを削除する機能はあるのですが、やはり一度lsとかで確認できるのが最高です。
僕は本当に臆病なので、ls | grep fugaでちゃんと削除されるファイルを確認しないと気が進まないのです!
まとめ
今回はよく使っているLinux/Unixコマンドをまとめてみました。
まだまだ知らないことはたくさんあるので、強者はこんなコマンドがあるよ〜なんてコメント欄にぜひ!!!
見習いは一度コマンドを叩いてみてください!
最後までお付き合いしてくださりありがとうございましたm(_ _)m