【2016年】今年お世話になったLinux/Unix系のコマンドをまとめてみた

どうも！最近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は指定したディレクトリに移動します。
最近知った便利なオプションは、[アドベントカレンダーの記事](http://qiita.com/ryosukes/items/b9a3b2913f72e1127e58)で先輩が紹介してくださった

```
$ 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