9年間Linux、Unix上で動くJavaやらCで書かれたクライアントアプリ、WEBアプリを開発してきたプログラマーがよく使用してきたLinuxコマンドのまとめです。
各コマンドの詳細な説明は、インターネット上に情報がたくさんあるので触れません。
(パイプも使いますがこのページ上では特には触れません)
想定読者
- Windows上で動くアプリをずっと作ったり、保守してきたからLinuxとか分からん。けど、最近Linux上で動くアプリの開発が増えているので、多少は覚えておかないとやばいかも知れないと思っている人。
- 今現在Linuxで動くためのアプリを作っている。が、開発はWindows上のみ。この先の工程はLinux上にアプリを置いてテストするけど、何かあったときにログなど見たい、採りたい。けどコマンドが分からない、な方。
- どんなコマンドがあるかも分からんわ!な方。
cd
Windowsにもあるやつです。
カレントディレクトリを移動します
ls
Windowsでいうところのdirコマンドです。
ファイルやディレクトリの所有者、権限を一覧表示するコマンドです。
cdしたらとりあえずlsコマンドもセットで打ってます。
# ファイル、ディレクトリ、隠しファイルを出力
ls -la
# ファイル、ディレクトリを更新時間の古い順に並べて一覧表示
ls -lrt
which
引数に与えたコマンド名にPathが通っていればどこにあるかを出力してくれます。
探しもののプログラムがどこにあるのか知りたい場合はとりあえずこれを叩いてみましょう。
which java
watch
簡易的に定周期で何かのコマンドを実行したい場合に使用すると便利です。
# 1秒間隔でdateコマンドを実行する
watch -n 1 date
1秒未満の周期にはできないので、もっと少ないスパンでコマンドを叩きたいと云った場合は、
シェルスクリプトを作るなりしましょう。
su
スーパユーザ(Windowsで云うところのadministrator)への切り替え
個人で立てたLinuxサーバで遊ぶ分には、suでユーザを切り替えて作業した方が楽です。
cp
ファイル、ディレクトリのコピーコマンドです。
# ファイルの属性(所有者や更新時刻)を保ってコピー
cp -p コピー元ファイル コピー先ファイル名
# ディレクトリとその配下のファイルの属性(所有者や更新時刻)を保ってコピー
cp -rp コピー元ディレクトリ コピー先ディレクトリ
mv
ファイル、ディレクトリの移動コマンドです。
mv 移動元ファイル、ディレクトリ 異動先
grep
Windowsユーザにもコマンド名はおなじみだと思います。
ファイル内検索をするコマンドです。
grep 検索文字 ファイル名
私はfindコマンドと絡めて使うことが多いです。
find . -name "¥ファイル名のパターン" -print | xargs grep --file=パターンファイル名
ex) find . -name ¥*.java -print | xargs grep --file=パターンファイル名
top
WindowsでいうところのタスクマネージャをCUIで表示したようなものです。
システム全体のメモリ使用料や負荷状況などが見れます。
私は主に、JavaのCPU、メモリの使用率、メモリの予約領域なんかを確認するのに使用しています。
私はオプションは特に付けないですが、topをたたいた後で「Ctrl + M」などして並べ替えしています。
netstat
portの使用状況を確認するのに使います。
Windowsでも同じコマンド名であったかと。(多分)
netstat -aon | grep port番号
ex) ORACLEとの接続を確認したい場合
netstat -aon | grep 1521
find
ファイルの検索で使用します。
上述のとおりでgrepコマンドと組み合わせて使うことが多いです。
vim、vi、view
超高機能な標準エディタです。
日頃Unix系を触っていて使えない人はいないんじゃないでしょうか。
日頃こっちに慣れている人は、WindowsでもVimを入れて使用している人が多いように感じます。(私も入れてる)
使い慣れると最強だと思いますが、いかんせん学習コストが高いのでUnix系経験者以外が使用しているところは今迄見たことがないです。
ちなみにvimとviはファイル編集を、viewは読み込み専用一時ファイルとして開きます。
viとvimも使い出すとできること、できないことがあるみたいですが、いまだにこの2コマンドの違いで困ったりしたことはないです。(多分使いこなしきれていないため)
注意点としては、サイズの大きいファイルを開くとあっという間にメモりを喰い潰すので、本番環境などで使ってはいけません。
cat
テキストファイルの内容を出力します。
複数ファイルの中身を連結したいときによく使用します。
cat ファイル名 > リダイレクト先ファイル
ex) cat *.log > xxxx.log
むかし朝っぱらに夜に吐いてたログを見るのに、
moreコマンド(1ページ分出力)と組み合わせて使ったりもしました。
cat ファイル名 | more
ちなみに、どでかいファイルをcatでmoreを使わずに出力すると
CPU使用率が100%に張り付いたりするので、やっぱり本番環境では使用に注意してください。
tail
テキストファイルの末尾を表示するコマンドです。
主にログの垂れ流ししながらアプリの動作確認を使用するのに使うことが多いです。
fail -f ファイル名
また、直近のログをとりあえず確認したいといったときに以下のようにして使用することも多いです。
fail -n 出力する末尾からの行数 ファイル名
ex) ログの内容をケツから1000行欲しい場合
tail -n 1000 error.log > error.log
scp
sshを使用してセキュアにファイル転送を行うコマンドです。
scp -p "転送元ファイル名" "IPアドレス":"転送先ファイル名"
scp -rp "転送元ディレクトリ" "IPアドレス":"転送先ディレクトリ"
ex) カレントディレクトリのログファイルを192.168.0.1の同一ユーザホームディレクトリのwork/log下に保存
scp -p *.log 192.168.0.1:~/work/log
本番環境などからファイルを転送させる場合、ネットワークに負荷をかけてアラートが上がるのも面白くないので、帯域制限をかけて使用することも多いです。
scp -l 制限 "転送元ファイル名" "IPアドレス":"転送先ファイル名"
制限の単位はkbit/secで指定します、
scp -l 800
と書くと、100kB/secで転送してくれます。
最終的に普段実作業をしているWindowsにファイルを落としてきたい場合は、WinSCPなどのWIndows向けSCPクライアントを使用して落としてきます。
ちなみにですが、scpコマンドでファイルを転送した場合に、転送先に既に転送先ファイル名のファイルがあり、そのファイルが誰かによって書き込まれるようなシーンがある場合、編集とぶつかるとファイルが破損する可能性があるので注意が必要です。
(システムに組み込もうとしない限りは気にする必要はないですが一応)
rsync
ファイル同期コマンドで、基本的にscpと同じことができ、使い方も同じです。
が、scpとは以下の点で異なります。
rsyncは、実ファイルを一時ファイルに落とした上でファイルを書き出し、転送が終わり次第実ファイルに反映されます。
ので、メモリは相応に喰ってしまいますが、scpと違って編集に対して安全にコピーは行えます。
システムに組み込むならscpではなく、rsyncで。
ちなみに、rsyncはローカル端末内にでも使用可能です。
ssh
この前投稿されていたので、そちらのリンクを貼ります。
インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識
ps
プロセス確認のコマンドです。
生存確認や、プロセス強制終了させたいからプロセスIDを知りたいときによく使います。
ps -ef | grep プロセス名
ex) javaのプロセスが知りたい場合
ps -ef | grep java
pgrep
プロセスIDが重複していなくて、プロセス名も分かっているときはこっちでも良いです。
プロセスに対応するプロセスIDを返してくれます。
pgrep プロセス名
traceroute
Windowsでいうところのtracertコマンドです。
通信経路が調べられます。
pingを打って帰ってこなかった場合に、通信がどこまで通っているかを確認するのによく使います。
(そこから先はインフラ屋さんに投げてます。
traceroute hostのipアドレス
ln
ファイル、ディレクトリへのリンクを貼ります。
バージョンの切り替えを容易にするために、よく使います。
シンボリックリンクを貼るコマンドを覚えておけばOK。
ln -s "リンク先ファイル or ディレクトリ" "リンク名"
ex)jdk1.8_XXをlatestという名前でリンクさせる
ln -s /usr/local/java/jdk1.8_XX latest
# 上記のようにするとコマンド実行したディレクトリにlatestができ、その実態は/usr/local/java/jdk1.8_XXを見に行くようになる
ifconfig、ip
Windowsのipconfigと同じです。
Redhat 7より小さいバージョンはifconfigコマンドが、
7より大きいバージョンの場合はipコマンドがデフォルトで入っています。
ipコマンドの場合は、サブコマンドが何個かあり、ifconfig相当のことを行いたい場合は、
ip addr と打って実行します。
init
シャットダウンなどのコマンドです。
もうどうしようもないから再起動したいとなった場合は、以下で再起動を。
※共用、本番環境では間違っても勝手に実行することのないように。
# 再起動
init 6
# シャットダウン
init 0
tar
ファイルの所有者、権限、シンボリックリンクを保持した状態でアーカイブするコマンドです。
Unix上でアーカイブする場合は、zipコマンドなどは使わずに常にtarコマンドを使用した方が個人的には良いかなと思います。
一時的にWindowsに持ってきても上記の情報が消えないためです。
zipコマンドだとWindowsに持ってきた時点で上記の情報が消えるので、再度Linuxに展開した場合に実行権限与えたりなんだりという手間がかかるようになっていまいます。(場合によっては復元の仕方が分からなく、ギブアップすることにもなりえます)
よってLinuxではtarコマンドだけを使いましょう。
# ZIP圧縮してアーカイブ
tar cvzf "圧縮ファイル名".tar.gz "圧縮対象ディレクトリ"
# アーカイブを展開
tar xvf tarファイル名
sed
Linuxで文字列操作するときに使用するコマンドです。
以下のページの説明が分かりやすいのでリンク貼ります。
sedの解説
awk
コマンドではなく、プログラム言語ですが覚えていると便利です。
イメージとしてはsedの強化版です。
このコマンドを使いこなせると、Linuxを使っているプロジェクトにちょっとヘルプへ逝ってこいと言われた場合に、経験上行った先でものすごく重宝されることが多いです。
sedの解説ページと同じ人の書いたページが分かりやすいと思います。
awkの解説
終わりに
Advent Calendarに参加してみたいよ〜!ってことでノリで書いてみましたが、
知っておいた方が良いだろうというコマンドが案外多くて最後は息切れしました。。
リソースと権限周りのコマンドに触れてませんが、非インフラな人のコマンドなので良いかなと。(土曜が終わるまでにめげずに加筆するかもです)
Linuxのコマンドは強力なものが多いので、Windowsでも使いたくなるかもしれません。
そんなときはGowをインストールしてみてはどうでしょうか。
Cygwinなどと違って軽量ですぐにインストールが終わるので、実行できるようになるまでが手間ではないです。
使えないコマンドもありますが、非常に重宝しています。
(軽量でもっと良いツールがあったら教えてください)