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


はじめに

プログラマーがSSH周りで知っておくと良いことが好評だったので、僕と同じようにプログラムは得意だけどLinuxなどのサーバー周りは苦手という人は多いのかなと思ったので第二弾を書きます。

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

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


余談

僕の経験では、WindowsでJava開発をしている人ほどこの辺りの技術が弱い人が多いと感じました。(実際、僕もJava開発をしている時はこの辺りが弱かったです。)

一方でPHPやRubyなどの開発をしている人はこの辺りの技術が強い気がしました。


ssh

プログラマーがSSH周りで知っておくと良いことに書いてまが、サーバーに入れる事が前提となりますので是非覚えておきましょう。

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


pwd

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

$ pwd

/home/ec2-user

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


cd

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

$ pwd

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

絶対パスで指定すると、自分がどのディレクトリにいても必ず同じディレクトリに移動できます。

頭に/をつける事がポイントです。

$ pwd

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

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

$ pwd

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

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


Linuxのディレクトリ構成

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

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


/etc

超重要な設定周りがここに格納されている場合が多いです。

自分がサーバー管理者でなければあまり触らない方が良いでしょう。

(大体において、このディレクトリの権限は与えられてません。)

プログラムだけを行っている場合は、この中身がどうなってるかを知らなくても問題ありません。

ただし、ApacheNginxなどの設定を変更する場合は後述するsudoコマンドを使って設定ファイルを編集する事もあるでしょう。


/etc/init.d

Linuxが起動した時に呼び出されるコマンドが格納されています。

起動時以外にもApache再起動などのコマンドが用意されている場合もあります。

# Apache再起動

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


/bin

Linuxで使用できるコマンドが格納されてます。

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

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


/var

サーバーの配置などをする事が多いディレクトリです。

ありがちな構成としては以下のようなところにWebサーバーを配置したりします。

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

ただ、最近はhomeを使う場合も増えてます。

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


/home/ユーザー名

ログインしたユーザーのホームディレクトリです。

このフォルダ以下を操作している限りは、他の人に迷惑をかける可能性が低いので何もわからない場合はこのディレクトリから出ないようにしましょうw


ls

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

$ ls

dir1 file.txt

現在のディレクトリに存在するディレクトリやファイルを表示します。

もう少し詳細を見る場合は以下のように実行します。

$ 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のシンタックスシュガーです。

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

$ 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も一緒につけて見るので以下のコマンドになるでしょう。

$ 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などがあります。

主にファイルを編集する時に使います。

$ vi ファイル名

viはかなり使用頻度が高いエディタなので、簡単に使い方の説明をします。

viにはコマンドモード編集モードがあり、はじめはコマンドモードで起動されます。


コマンドモードでできること

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


編集モードへ変更

キーボードの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

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

$ tail ファイル名

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

$ tail -f ファイル名

と打つと、ファイルに書き込まれた情報が表示され続けます。

終了する時には[ctrl]+cで終了できます。


less

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

$ less ファイル名

ファイルの中身を確認したい場合などに便利です。

:qで終了します。


touch

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

$ touch ファイル名

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


mkdir

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

$ mkdir ディレクトリ名

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

$ mkdir -p dir1/dir2/dir3


rm

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

$ rm ファイル名

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

$ rm -r ディレクトリ名

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

$ rm -rf ディレクトリ名

危険なコマンドなので扱いには注意してください。

事前にls -lなどで確認してから実施した方が良いでしょう。


cp

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

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


mv

ファイルを移動させます。

リネームする際にも使用します。

# リネーム

$ mv file1.txt file_tmp.txt
# 移動
$ mv file1.txt /var/www/hoge/file1.txt


ln

シンボリックリンクを張るときに使います。

ハードリンクで使ったことはないので、以下の書式だけ覚えておけば良いでしょう。

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

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


chmod

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

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

# 全ての権限を与える。

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

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


chown

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

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

ファイルやディレクトリの所有権を変更します。

所有権を変えることで自分がアクセスできなく可能性がありますので、注意してください。


sudo

root権限で処理を実行したい時に使います。

使用用途としては、サーバーの再起動やパーミッション(権限)を持ってないファイルの中身を編集する場合などに使います。

sudo apachectl restart

大体において、ログインユーザーのパスワードが求められます。

設定によってはパスワード無しでも実行できます。


su

rootユーザーなど、他のユーザーに成り代わる時に使います。

プログラマーにこの権限が与えられることはないでしょう。

$ su

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


ps

以外と使用するコマンドです。

プロセスの実行状態を確認します。

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

$ 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を止める場合は以下のようになります。

kill 9999

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

kill -9 9999

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


top

全体のプロセス状態を見ます。

ロードアベレージを見たり、重いプロセスを探す時に使ったりします。

$ top

qで終了します。


which

コマンドが実際に実行されているパスを探します。

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

$ which ruby

/home/ユーザー名/.rbenv/shims/ruby

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


history

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

$ history

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


df

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

$ df -h

全体のファイルサイズなどを確認する時に使います。

-hを入れたほうが見やすいです。


du

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

$ du -sh ディレクトリ名

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


scp

サーバーのファイルをローカルに持ってきたり、ローカルのファイルをサーバーに持っていく時に使います。

大抵においてローカルPCで叩くことが多いです。(ローカルIPは変わりやすいので・・・)

# ローカルからサーバーへファイルコピー

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

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

プログラマーがSSH周りで知っておくと良いことに記載しているconfigを設定しておくと上記のように楽に行えます。

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

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


crontab

プログラマーとしてはあまり触りたく無いコマンドです。

定期バッチ処理などの登録で使います。

# 内容確認

$ crontab -l
# 編集処理
$ crontab -e

これ以外のコマンドは使わない方が無難です。

また、定期的にバックアップを取ることをお勧めします。

crontabはユーザー単位で作成されますので、自分のユーザーが作成したcrontabがrootユーザーに影響することはありません。

cronで実施されるプログラムが影響することはあります。)


yum/apt-get

プログラマーが使うことはあまりありません。

パッケージ管理されたプログラムを取得します。

# Centos系

$ yum install ***
# Ubuntu系
$ apt-get install ***

ただ、稀に使うので存在だけは知っておくといいです。

プログラマーがこの辺をいじる時はchefでなんとかしたいものです・・・


curl

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

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

主な用途としては、プログラムファイルなどを取得してmakeする時などに使ったりします。

が、makeなどはあまり使わないと思うので割愛。

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


TABキー

コマンドでは無いのですが、何かと重宝します。

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


上下キー

直前のコマンドなどを再表示します。

かなり重宝します。


起動時に読み込まれるファイル

覚えておくと便利なのが.bash_profileファイルです。

ここに記述した内容がログイン(SSH)時に反映されます。

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

$ vi ~/.bash_profile

# 以下の行を追加する。
alias ll='ls -l'

これで次回ログイン時からllコマンドが使用できます。

すぐに反映したい場合は以下のコマンドを実行します。

$ source ~/.bash_profile

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

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

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


exit

SSHの通信を終了します。


最後に

使うコマンドなんてそんなにないだろう・・・と思って書いてたら結構使ってることに気づいた。

思い出せる限りで書いてみました。

なお、grepやfindが無いのは僕自身があまり使わないためです・・・。

パイプを使った後のgrepはよく使うのですが・・・。

ちなみに僕は20代〜30代前半までWindowsの開発が多かったため、これらのコマンドを30代中盤で覚えました。

覚えると便利ですが、初めの敷居は高かった事を覚えてます。

(サーバーでプログラムを動かすリスクがとても高いと思っていたので・・・)

今の時代はプログラム兼運用というケースは珍しくないので、早いうちにこれらの事を覚えておくといいと思います。

(僕もまだまだですが、苦手というほど苦手ではなくなりました。)