プログラマーが知っておくと良いLinuxコマンド

## はじめに
[プログラマーがSSH周りで知っておくと良いこと](http://qiita.com/syou007/items/9bbc1b50b9608651c390)が好評だったので、僕と同じようにプログラムは得意だけどLinuxなどのサーバー周りは苦手という人は多いのかなと思ったので第二弾を書きます。

前回と同じで、深い技術ではなく浅い技術で僕がよく使うコマンドをまとめておきます。

本記事は`centos`を基準に記載してます。LinuxやUnixならほとんど同じコマンドは使えるはずです。

### 余談
僕の経験では、WindowsでJava開発をしている人ほどこの辺りの技術が弱い人が多いと感じました。（実際、僕もJava開発をしている時はこの辺りが弱かったです。）
一方でPHPやRubyなどの開発をしている人はこの辺りの技術が強い気がしました。

## ssh
[プログラマーがSSH周りで知っておくと良いこと](http://qiita.com/syou007/items/9bbc1b50b9608651c390)に書いてまが、サーバーに入れる事が前提となりますので是非覚えておきましょう。

ちなみに僕はWindowsで開発している時は`Poderosa`を使ってサーバーへ入ってました。Macで開発するようになってから使わなくなりましたが・・・。

## pwd
何はともあれ、自分が現在いるディレクトリ位置を確認する事は重要です。

```console
$ pwd
/home/ec2-user
```

現在自分がいるディレクトリを教えてくれます。

## cd
他のディレクトリに移動する時に使います。

```console
$ pwd
/home/ec2-user
$ cd /var
$ pwd
/var
```

絶対パスで指定すると、自分がどのディレクトリにいても必ず同じディレクトリに移動できます。
頭に`/`をつける事がポイントです。

```console
$ pwd
/home/ec2-user
$ cd tmp
$ pwd
/home/ec2-user/tmp
```

相対パスで指定すると現在のディレクトリを起点に移動します。

```console
$ pwd
/home/ec2-user/tmp
$ cd ~
$ pwd
/home/ec2-user
```

`~`は特殊な文字列で自分のホームに戻ります。

## Linuxのディレクトリ構成
僕がLinuxを触った時にどこに何があるかわからなかったので、僕がよく使うLinuxのディレクトリ構成を説明します。

少ないですが、下記のディレクトリだけを知っていれば大体において問題なくプログラマーの仕事はできると思います。

### /etc
超重要な設定周りがここに格納されている場合が多いです。
自分がサーバー管理者でなければあまり触らない方が良いでしょう。
（大体において、このディレクトリの権限は与えられてません。）

プログラムだけを行っている場合は、この中身がどうなってるかを知らなくても問題ありません。
ただし、`Apache`や`Nginx`などの設定を変更する場合は後述する`sudo`コマンドを使って設定ファイルを編集する事もあるでしょう。

### /etc/init.d
Linuxが起動した時に呼び出されるコマンドが格納されています。
起動時以外にも`Apache`再起動などのコマンドが用意されている場合もあります。

```console
# Apache再起動
$ /etc/init.d/httpd start
# もしくは以下
$ apachectl start
# sudoが必要な場合がほとんど
$ sudo apachectl start
```

### /bin
Linuxで使用できるコマンドが格納されてます。
どんなコマンドが使えるのかを知りたい時に見るといいかもしれませんが、プログラマーが直接操作することはないです。

知らないうちに使っているフォルダです。

### /var
サーバーの配置などをする事が多いディレクトリです。
ありがちな構成としては以下のようなところにWebサーバーを配置したりします。

```console
$ cd /var/www/サービス名/
```

ただ、最近は`home`を使う場合も増えてます。
`capistrano`などのデプロイツールを使う場合は、デプロイするユーザーを固定する場合が多く`home`ディレクトリに配置した方がパーミッション（権限）などの問題に遭遇しない為です。

### /home/ユーザー名
ログインしたユーザーのホームディレクトリです。
このフォルダ以下を操作している限りは、他の人に迷惑をかける可能性が低いので何もわからない場合はこのディレクトリから出ないようにしましょうw

## ls
`cd`と同じくらい多様するコマンドです。

```console
$ ls
dir1 file.txt
```

現在のディレクトリに存在するディレクトリやファイルを表示します。
もう少し詳細を見る場合は以下のように実行します。

```console
$ ls -l
drwx------ 8 ec2-user ec2-user  4096 11月 17 11:28 dir1
-rw-rw-r-- 1 ec2-user ec2-user 18736 11月 17 10:18 file.txt
```

### ll
現場によっては用意されているコマンドです。
大抵において`ls -l`のシンタックスシュガーです。

叩いてみてあったら使いましょう！

```console
$ ll
drwx------ 8 ec2-user ec2-user  4096 11月 17 11:28 dir1
-rw-rw-r-- 1 ec2-user ec2-user 18736 11月 17 10:18 file.txt
```

### 隠しファイルも見たい場合
`ls`コマンドに`-a`を付けると隠しファイルやディレクトリも見れます。
大抵は`-l`も一緒につけて見るので以下のコマンドになるでしょう。

```console
$ ls -la
-rw-r--r-- 1 ec2-user ec2-user   193  2月  3 06:02 .bash_profile
-rw-r--r-- 1 ec2-user ec2-user   124  2月  3 06:02 .bashrc
drwx------ 2 ec2-user ec2-user  4096  2月 17 09:43 .ssh
...
drwx------ 8 ec2-user ec2-user  4096  2月 17 11:28 dir1
-rw-rw-r-- 1 ec2-user ec2-user 18736  2月 17 10:18 file.txt
```

`ls`コマンドに関してはこれだけ知っていれば十分でしょう。

## vi
`vi`コマンドは奥が深いコマンドです。
似たようなものに`vim`などがあります。
主にファイルを編集する時に使います。

```console
$ vi ファイル名
```

`vi`はかなり使用頻度が高いエディタなので、簡単に使い方の説明をします。
`vi`には`コマンドモード`と`編集モード`があり、はじめは`コマンドモード`で起動されます。

### コマンドモードでできること
`yy`や`p`など便利なコマンドも多数ありますが、最低限これだけを知っていれば十分だろうというものを載せておきます。

#### 編集モードへ変更
キーボードの`a`を押すと編集モードに移行します。
他の方法でも移行できますが、ここでは割愛します。

#### 検索
`/***`で検索できます`***`の部分に検索したい文字を入れてください。

#### 置換
`:s/[old]/[new]`でその行のはじめに見つかった文字を置換します。
`:%s/[old]/[new]/g`で文中のすべての文字を置換します。

#### 行番号を表示する
`:set number`で行番号が表示されます。
行番号を消す方法は・・・知りませんw

#### 指定の行にジャンプする
`**G`の`**`に行番号を入れます。
`G`が大文字なのに注意してください。

なお、`0G`と打つと一番最後が表示されます。

#### 文字コードの変更
エンコードの問題で文字化けしているファイルを見る時は`:set encoding=utf-8`などと打てば見れるようになります。

編集する場合は`:set fenc=文字コード`などで文字コードを変更して保存する必要があります。

#### 一つ前の状態に戻る（undo）
置換や編集モードで誤った場合は`u`を押すと一つ前の状態に戻ります。

#### ファイルを保存する
変更内容を保存する時は`:w`で保存できます。

#### viを閉じる。
`:q`でviを閉じれます。
保存していない状態ではこのコマンドは受け付けられないので`:w`で保存して`:q`を行います。
もしくは`:wq`と打ち込むと保存して終了します。

編集内容を保存したくない場合は`:q!`と打つと編集破棄してviを閉じます。

### 編集モードでできること
キー操作がいろいろありますが、、、ここでは割愛します。
`ctrl+c`などでペーストもできるので、何も知らなくても気合いでなんとかなると思います。

#### コマンドモードへ変更
`esc`キーを押下するとコマンドモードへ戻ります。

## view
`vi`を参照専用で開きます。
編集すると問題が発生する場合は`view`を使ってください。

なお、`vi -R`と打っても同じです。

## tail
ファイルの最後を表示してくれます。

```console
$ tail ファイル名
```

ログなどをコンソールに出しておきたい場合は

```console
$ tail -f ファイル名
```

と打つと、ファイルに書き込まれた情報が表示され続けます。
終了する時には`[ctrl]+c`で終了できます。

## less
ファイルの内容をコンソールに出力します。

```console
$ less ファイル名
```

ファイルの中身を確認したい場合などに便利です。
`:q`で終了します。

## touch
空のファイルを作成します。

```console
$ touch ファイル名
```

なお、中身のあるファイルを作成する場合は`vi`で存在しないファイル名を指定して保存すると出来ます。

## mkdir
ディレクトリを作成します。

```console
$ mkdir ディレクトリ名
```

中間ディレクトリなども一括で作って欲しい場合

```console
$ mkdir -p dir1/dir2/dir3
```

## rm
ファイルやディレクトリを削除する時に使用します。

```console
$ rm ファイル名
```

ディレクトリを削除したい場合

```console
$ rm -r ディレクトリ名
```

ディレクトリ内部の削除確認メッセージを飛ばす場合

```console
$ rm -rf ディレクトリ名
```

危険なコマンドなので扱いには注意してください。
事前に`ls -l`などで確認してから実施した方が良いでしょう。

## cp
ファイルをコピーする時に使います。

```console
$ cp 元ファイル 先ファイル
```

## mv
ファイルを移動させます。
リネームする際にも使用します。

```console
# リネーム
$ mv file1.txt file_tmp.txt
# 移動
$ mv file1.txt /var/www/hoge/file1.txt
```

## ln
シンボリックリンクを張るときに使います。
ハードリンクで使ったことはないので、以下の書式だけ覚えておけば良いでしょう。

```console
$ ln -s リンク元 リンク先
```

そこに存在しないファイルを、存在するように見せたりするコマンドでデプロイ周りで使われることが多いでしょう。

## chmod
LinuxはWindowsよりもファイルやディレクトリの権限が厳しいので、何も考えずにファイルを作成して他の人に渡しても他の人は見れない場合があります。

その際に`chmod`で権限を与えます。

```console
# 全ての権限を与える。
$ chmod 777 ファイル名/ディレクトリ名
# 全てのユーザーに実行権限だけ与える
$ chmod +x ファイル名/ディレクトリ名
```

プログラマーに渡されている権限の場合は`777`で全てのアクセスを許可させても問題にならない場合が殆どです。

## chown
`chmod`より使用頻度は低く、プログラマーが扱うケースはあまりないでしょう。

```console
$ chown user:group ファイル名/ディレクトリ名
```

ファイルやディレクトリの所有権を変更します。
所有権を変えることで自分がアクセスできなく可能性がありますので、注意してください。

## sudo
root権限で処理を実行したい時に使います。
使用用途としては、サーバーの再起動やパーミッション（権限）を持ってないファイルの中身を編集する場合などに使います。

```sh
sudo apachectl restart
```

大体において、ログインユーザーのパスワードが求められます。
設定によってはパスワード無しでも実行できます。

## su
rootユーザーなど、他のユーザーに成り代わる時に使います。
プログラマーにこの権限が与えられることはないでしょう。

```console
$ su
```

成り代わるユーザーのパスワードが求められます。

## ps
以外と使用するコマンドです。
プロセスの実行状態を確認します。

例えば、`unicorn`のプロセスを見る時には以下のような使い方をします。

```console
$ ps aux | grep unicorn
app       9999  0.0 10.3 428144 105628 ?       Sl   Nov20   0:02 unicorn_rails master -c /home/user_name/staging/current/config/unicorn.rb -E staging -D                                                       
ec2-user 99999  0.0  0.2 110476  2180 pts/0    S+   15:00   0:00 grep --color=auto unicorn
```

トラブルが発生した場合には良く使うので、上記の書式だけでも覚えておくと良いと思います。

## kill
プロセスが暴走している場合などの時に使います。
上記の`ps`コマンドと併用して使います。

上記の例にある`unicorn`を止める場合は以下のようになります。

```sh
kill 9999
```

これでも止まらなくて困る場合は以下の方法で消せます。

```sh
kill -9 9999
```

このコマンドは強制終了になります。

## top
全体のプロセス状態を見ます。
ロードアベレージを見たり、重いプロセスを探す時に使ったりします。

```console
$ top
```

`q`で終了します。

## which
コマンドが実際に実行されているパスを探します。
例えば`ruby`コマンドがどこで実行されているかを調べる場合は以下のようになります。

```console
$ which ruby
/home/ユーザー名/.rbenv/shims/ruby
```

`rbenv`でrubyが実行されていることがわかります。

## history
昔使ったコマンドを思い出したり、共有ユーザーを使っている時に他の人のコマンドみたり・・・という時に使います。

```console
$ history
```

表示されたコマンドを実行することもできますが・・・僕は使ったこと無いです。

## df
ファイルシステムの使用状況を見ます。

```console
$ df -h
```

全体のファイルサイズなどを確認する時に使います。
`-h`を入れたほうが見やすいです。

## du
指定ディレクトリのファイルサイズを確認する時に使います。

```console
$ du -sh ディレクトリ名
```

大抵はディレクトリ内全てのボリュームを見たいと思うので、上記だけを覚えておけばOK。

## scp
サーバーのファイルをローカルに持ってきたり、ローカルのファイルをサーバーに持っていく時に使います。
大抵においてローカルPCで叩くことが多いです。（ローカルIPは変わりやすいので・・・）

```console
# ローカルからサーバーへファイルコピー
$ scp ~/tmp/hoge.txt staging:~/tmp/
# サーバーからローカルへファイルコピー
$ scp staging:~/tmp/ ~/tmp/hoge.txt

# ディレクトリの場合
$ scp -r ~/tmp/hoge/ staging:~/tmp/
```

[プログラマーがSSH周りで知っておくと良いこと](http://qiita.com/syou007/items/9bbc1b50b9608651c390)に記載している`config`を設定しておくと上記のように楽に行えます。

`rsync`も似たような形式で使えますが、scpだけ覚えておければほとんど問題無いです。

慣れると`cp`コマンドのように使えるようになります。

## crontab
プログラマーとしてはあまり触りたく無いコマンドです。
定期バッチ処理などの登録で使います。

```console
# 内容確認
$ crontab -l
# 編集処理
$ crontab -e
```

これ以外のコマンドは使わない方が無難です。
また、定期的にバックアップを取ることをお勧めします。

`crontab`はユーザー単位で作成されますので、自分のユーザーが作成した`crontab`がrootユーザーに影響することはありません。
（`cron`で実施されるプログラムが影響することはあります。）

## yum/apt-get
プログラマーが使うことはあまりありません。
パッケージ管理されたプログラムを取得します。

```console
# Centos系
$ yum install ***
# Ubuntu系
$ apt-get install ***
```

ただ、稀に使うので存在だけは知っておくといいです。
プログラマーがこの辺をいじる時は`chef`でなんとかしたいものです・・・

## curl
サーバーからデータを取得する時に使います。

```console
$ curl -o hoge.jpg  http://www.example.com/hoge.jpg
```

主な用途としては、プログラムファイルなどを取得して`make`する時などに使ったりします。
が、`make`などはあまり使わないと思うので割愛。

ついでに`zip`や`unzip`も割愛しますが、時と場合によっては使う事があるので覚えておくに越した事は無いです。

## TABキー
コマンドでは無いのですが、何かと重宝します。
コマンドやパスを途中までタイピングしてから`tab`を押下すると、あまりの文字列が保管されたり候補が表示されたりします。

## 上下キー
直前のコマンドなどを再表示します。
かなり重宝します。

## 起動時に読み込まれるファイル
覚えておくと便利なのが`.bash_profile`ファイルです。
ここに記述した内容がログイン（SSH）時に反映されます。

例えば、`ll`コマンドが無い場合は以下のようにして設定する事ができます。

```console
$ vi ~/.bash_profile
# 以下の行を追加する。
alias ll='ls -l'
```

これで次回ログイン時から`ll`コマンドが使用できます。
すぐに反映したい場合は以下のコマンドを実行します。

```console
$ source ~/.bash_profile
```

また、`PATH`を追加しておくと自分が作成したシェルを読み込んでおく事ができます。

```sh
export PATH="$HOME/.bin:$PATH"
```

このように設定すると、`~/.bin`配下のプログラムへパスが通るようになります。

## exit
SSHの通信を終了します。

## 最後に
使うコマンドなんてそんなにないだろう・・・と思って書いてたら結構使ってることに気づいた。
思い出せる限りで書いてみました。

なお、grepやfindが無いのは僕自身があまり使わないためです・・・。
パイプを使った後のgrepはよく使うのですが・・・。

ちなみに僕は20代〜30代前半までWindowsの開発が多かったため、これらのコマンドを30代中盤で覚えました。
覚えると便利ですが、初めの敷居は高かった事を覚えてます。
（サーバーでプログラムを動かすリスクがとても高いと思っていたので・・・）

今の時代はプログラム兼運用というケースは珍しくないので、早いうちにこれらの事を覚えておくといいと思います。
（僕もまだまだですが、苦手というほど苦手ではなくなりました。）