JavaScript
Rails
Linux
Node.js
docker

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

More than 1 year has passed since last update.

どうも!最近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