Git メモ
はじめに
Gitの個人メモ。
文書中のコマンドもハイライトにしたかったけど、やり方がわからんかった・・・。
目次
インストール
インストールされている事が多いですが、念の為。yum install でインストールしよう。
[centos@ip-172-31-3-100 ~]$ sudo yum install git
git --version でバージョンが確認できればインストールは完了
[centos@ip-172-31-3-100 ~]$ git --version git version 1.7.1 [centos@ip-172-31-3-100 ~]$
使い方
初期セットアップ
git config コマンドにパラメータを指定して、ユーザ名とメールアドレスを設定。これをしないとcommit 出来ないので、最初にやっておく。
[centos@ip-172-31-3-100 ~]$ git config --global user.email "hogehoge@domain.com" [centos@ip-172-31-3-100 ~]$ git config --global user.name "hogehoge"
設定内容の確認方法。git config --list で全てのパラメータを確認出来る。--list を個別パラメータに変更すれば、個別に確認可能。
[centos@ip-172-31-3-100 shellscript]$ git config user.email hogehogehoge@domain.com [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git config --list user.email=hogehoge@domain.com user.name=hogehoge core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* remote.origin.url=git@bitbucket.org:hogehoge/shellscript.git branch.master.remote=origin branch.master.merge=refs/heads/master [centos@ip-172-31-3-100 shellscript]$
設定内容はいろいろな場所に保存される可能性が、基本的にはユーザのホームディレクトリの .gitconfig に保存されています。 修正したい場合は、対象ファイルをを直接編集してもOK。
[centos@ip-172-31-3-100 ~]$ cat ~/.gitconfig [user] email = hogehoge@domain.com name = hogehoge [centos@ip-172-31-3-100 ~]$
SSHのセットアップ
HTTPだと毎回パスフレーズ入力が必要なので、パスなしの秘密鍵を作成しておく。
秘密鍵の作成は、下記記事を参考。 chimay.hatenablog.com
公開鍵を確認して、Github,GitBucketなどのアカウント設定でSSH公開鍵を登録する
[centos@ip-172-31-3-100 .ssh]$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvXUH47WGmheQRJxtp3t572Srn6NLy/SdPvPstrtKz330B+il9xaNHhPkPRmqA3HtgkR/jKo4OFYX1oU7/ql0XLVt+E7JKnE/dyhkW893pP0ROOMB4lr1gA/h+GgAkB/JtYjGhMjbZrMc7NCGrB8x6o5cv6EI+b5e/tGSpj1JuokCI9/7w6J9ZaJkQuu65DaCBIJKXEMJZY3GU8klDdDZgQdQP2ANdmmCrefZfIZiYG0Aq4Fr+rdYXnijIqAjCHAgOa/12hcHhcIDeF0LUbYpvwN2HQ20jmu0ez7+9wA2NaGWPHZipRcP33o9+aZLs84mSUZ6aAw92dRJG6qO9F45uQ== centos@ip-172-31-3-100 [centos@ip-172-31-3-100 .ssh]$
秘密鍵の権限を確認する。
owner と group がユーザでかつ権限が 600 のみになっている事。
[centos@ip-172-31-3-100 ~]$ ls -la ~/.ssh/id_rsa -rw-------. 1 centos centos 1675 Jun 24 21:31 /home/centos/.ssh/id_rsa [centos@ip-172-31-3-100 ~]$
権限が異なる場合は、変更する
[centos@ip-172-31-3-100 ~]$ chown centos:centos /home/centos/.ssh/id_rsa [centos@ip-172-31-3-100 ~]$ chmod 600 /home/centos/.ssh/id_rsa [centos@ip-172-31-3-100 ~]$ ls -la ~/.ssh/id_rsa -rw-------. 1 centos centos 1675 Jun 24 21:31 /home/centos/.ssh/id_rsa [centos@ip-172-31-3-100 ~]$
リポジトリの複製
SSHの設定が問題なく登録できれば、パスなしでリモートからローカルに複製できる。URLは適宜置き換えてください。
[centos@ip-172-31-3-100 ~]$ git clone git@bitbucket.org:hogehoge/shellscript.git Initialized empty Git repository in /home/centos/shellscript/.git/ remote: Counting objects: 21, done. remote: Compressing objects: 100% (19/19), done. remote: Total 21 (delta 7), reused 0 (delta 0) Receiving objects: 100% (21/21), done. Resolving deltas: 100% (7/7), done. [centos@ip-172-31-3-100 ~]$
ブランチの確認
git branch コマンドで確認可能。-a オプションを付ける事で remote のbranch も確認出来ます。
[centos@ip-172-31-3-100 shellscript]$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master [centos@ip-172-31-3-100 shellscript]$
ブランチの作成
git branch コマンドの引数に作成したいブランチ名を指定。例ではローカルで開発用のdevというブランチを作成しています。作成するだけでは、ブランチが切り替わらない点も注意です。
[centos@ip-172-31-3-100 shellscript]$ git branch dev [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git branch -a dev * master remotes/origin/HEAD -> origin/master remotes/origin/master [centos@ip-172-31-3-100 shellscript]$
ブランチの切り替え
git checkout コマンドでブランチ名を指定する事でブランチが切り替わります。切り替わった事を確認したら、実際に編集してみる。
[centos@ip-172-31-3-100 shellscript]$ git checkout dev Switched to branch 'dev' [centos@ip-172-31-3-100 shellscript]$ git branch -a * dev master remotes/origin/HEAD -> origin/master remotes/origin/master [centos@ip-172-31-3-100 shellscript]$
変更履歴を確認する
git status コマンドを使って確認できる。変更前の確認。
[centos@ip-172-31-3-100 shellscript]$ git status # On branch dev nothing to commit (working directory clean) [centos@ip-172-31-3-100 shellscript]$
新規ファイル(test.sh)を作成。再度、git status で変更履歴がしっかり表示されていることを確認
[centos@ip-172-31-3-100 shellscript]$ git status # On branch dev # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test.sh nothing added to commit but untracked files present (use "git add" to track) [centos@ip-172-31-3-100 shellscript]$
変更差分を確認する
git diff コマンドで変更したファイルの変更差分を確認する事ができる。diff のあとにファイルを指定する事で特定ファイルのみの差分確認も可能。なお、空ファイルの作成では diff の結果として出力されなかった。
[centos@ip-172-31-3-100 shellscript]$ git status # Not currently on any branch. # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: test2.sh # no changes added to commit (use "git add" and/or "git commit -a") [centos@ip-172-31-3-100 shellscript]$ git diff diff --git a/test2.sh b/test2.sh index e69de29..48b1ba2 100644 --- a/test2.sh +++ b/test2.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Hellow World" [centos@ip-172-31-3-100 shellscript]$
インデックスへの追加
commit の前に変更したファイルをインデックスに追加する必要がある。git add コマンドの引数にファイルパスを指定する事で、指定したファイルをインデックスに登録できる。
[centos@ip-172-31-3-100 shellscript]$ git add test.sh [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git status # On branch dev # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: test.sh # [centos@ip-172-31-3-100 shellscript]$
もし、誤って違うファイルを追加した場合でも git resetコマンドで対象ファイルを指定すればインデックスから削除する事が出来る
[centos@ip-172-31-3-100 shellscript]$ git reset test.sh [centos@ip-172-31-3-100 shellscript]$ git status # On branch dev # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test.sh nothing added to commit but untracked files present (use "git add" to track) [centos@ip-172-31-3-100 shellscript]$
複数ファイルを変更した場合だといちいちファイルを指定してられないので、git add --all (もしくは -A) を付与する事で全てのファイルを追加できる。
[centos@ip-172-31-3-100 shellscript]$ git status # On branch dev # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test.sh # test2.sh nothing added to commit but untracked files present (use "git add" to track) [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git add --all [centos@ip-172-31-3-100 shellscript]$ git status # On branch dev # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: test.sh # new file: test2.sh # [centos@ip-172-31-3-100 shellscript]$
コミットする
git commit コマンドでインデックスに登録した変更内容をコミットする。-m オプションでコミットメッセージを指定。コメントは必須なので、作業内容を誰が見てもわかるように解りやすく指定する。
[centos@ip-172-31-3-100 shellscript]$ git commit -m "initial commit" [dev 439582b] initial commit 1 files changed, 3 insertions(+), 0 deletions(-) create mode 100644 test.sh create mode 100644 test2.sh [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git status # On branch dev nothing to commit (working directory clean) [centos@ip-172-31-3-100 shellscript]$
なお、git commit コマンドに -a オプションを付与する事でインデックスへの登録とコミットを同時に行う事ができる。但し、削除・変更のみで 新規ファイルの追加は -a オプションではコミットされないので注意。
[centos@ip-172-31-3-100 shellscript]$ git status # Not currently on any branch. # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: test2.sh # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test3.sh no changes added to commit (use "git add" and/or "git commit -a") [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git commit -a -m "create test3.sh" [detached HEAD b206404] create test3.sh 1 files changed, 3 insertions(+), 0 deletions(-) [centos@ip-172-31-3-100 shellscript]$ git status # Not currently on any branch. # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test3.sh nothing added to commit but untracked files present (use "git add" to track) [centos@ip-172-31-3-100 shellscript]$
コミットログを確認する
git log コマンドで変更履歴を確認する事ができる。--oneline を付与する事で、各コミットログを1行にまとめる事ができる。短縮されたハッシュ値でもコマンドの引数としては有効に動作します。
[centos@ip-172-31-3-100 shellscript]$ git log commit 439582b1b43ae87e84e9bbaa8cade472ff57f835 Author: hogehoge <hogehogehoge@domain.com> Date: Sun Jun 26 19:48:08 2016 +0000 initial commit [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git log --oneline 439582b initial commit [centos@ip-172-31-3-100 shellscript]$
ファイルを削除する
git rm コマンドで不要なファイルを削除することができる。インデックスに登録済みの場合でも、-f を付与する事で削除できる。
[centos@ip-172-31-3-100 shellscript]$ git rm -f test2.sh rm 'test2.sh' [centos@ip-172-31-3-100 shellscript]$
特定のリビジョンに戻る
git checkout コマンドで特定のリビジョンのコミットハッシュ値を指定する事で、指定したリビジョンまで戻る事ができる。短縮されたハッシュ値でも有効。
[centos@ip-172-31-3-100 shellscript]$ git commit -m "delete test2.sh" [detached HEAD 0ff40e8] delete test2.sh 0 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test2.sh [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git log --oneline 0ff40e8 delete test2.sh 439582b initial commit 2bf942c 変数化 5417639 new file 61979b7 backup2s3 created online with Bitbucket 6fa1a30 sendmessage_perl.sh created online with Bitbucket 1d79198 swap.sh created online with Bitbucket ccabd68 create check_access.sh 6be6f02 Initial commit with contributors [centos@ip-172-31-3-100 shellscript]$ git checkout 439582b Previous HEAD position was 0ff40e8... delete test2.sh HEAD is now at 439582b... initial commit [centos@ip-172-31-3-100 shellscript]$
未登録のファイルを削除する
git cleanを使う事で未登録ファイルを削除する事ができる。未登録とは git status コマンドで Untracked になっているファイルの事。この例だと、test3.sh のみインデックスに登録したのでそれ以外は削除される事になる。デフォルトの設定では -f オプションを付与しないと事故防止の意味合いもあって、エラーになる。clean.requireForce という設定値を変更する事で、変えられるがあまりお勧めはしない。
また、-n オプションを付与する事で削除対象ファイルを確認する事ができる。削除はくれぐれも慎重に!
[centos@ip-172-31-3-100 shellscript]$ touch test{3..30}.sh [centos@ip-172-31-3-100 shellscript]$ git add test3.sh [centos@ip-172-31-3-100 shellscript]$ git status # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: test3.sh # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test10.sh # test11.sh # test12.sh # test13.sh # test14.sh # test15.sh # test16.sh # test17.sh # test18.sh # test19.sh # test20.sh # test21.sh # test22.sh # test23.sh # test24.sh # test25.sh # test26.sh # test27.sh # test28.sh # test29.sh # test30.sh # test4.sh # test5.sh # test6.sh # test7.sh # test8.sh # test9.sh [centos@ip-172-31-3-100 shellscript]$ git clean -n Would remove test10.sh Would remove test11.sh Would remove test12.sh Would remove test13.sh Would remove test14.sh Would remove test15.sh Would remove test16.sh Would remove test17.sh Would remove test18.sh Would remove test19.sh Would remove test20.sh Would remove test21.sh Would remove test22.sh Would remove test23.sh Would remove test24.sh Would remove test25.sh Would remove test26.sh Would remove test27.sh Would remove test28.sh Would remove test29.sh Would remove test30.sh Would remove test4.sh Would remove test5.sh Would remove test6.sh Would remove test7.sh Would remove test8.sh Would remove test9.sh [centos@ip-172-31-3-100 shellscript]$ [centos@ip-172-31-3-100 shellscript]$ git clean -f Removing test10.sh Removing test11.sh Removing test12.sh Removing test13.sh Removing test14.sh Removing test15.sh Removing test16.sh Removing test17.sh Removing test18.sh Removing test19.sh Removing test20.sh Removing test21.sh Removing test22.sh Removing test23.sh Removing test24.sh Removing test25.sh Removing test26.sh Removing test27.sh Removing test28.sh Removing test29.sh Removing test30.sh Removing test4.sh Removing test5.sh Removing test6.sh Removing test7.sh Removing test8.sh Removing test9.sh [centos@ip-172-31-3-100 shellscript]$ git status # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: test3.sh # [centos@ip-172-31-3-100 shellscript]$
まとめ
まだまだできる事があるので、気が向いたら随時アップデートしていきます。
ssh-keygen まとめ
はじめに
ssh-keygen のよく使うオプションをまとめてみた。
作成
オプションなし
特にオプションなしでも作れる。この場合、OpenSSHのバージョン依存で bitや鍵の種類が決まるのであまりお勧めはしない。
[centos@ip-172-31-3-100 ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/centos/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/centos/.ssh/id_rsa. Your public key has been saved in /home/centos/.ssh/id_rsa.pub. The key fingerprint is: fb:f2:a0:05:3b:62:cf:cf:42:3a:87:c6:16:53:e4:a1 centos@ip-172-31-3-100 The key's randomart image is: +--[ RSA 2048]----+ | | | o | | + . | | E o | | .. S | | o .o . | | .o*o + | | .B+o=.o | | o o+oooo | +-----------------+ [centos@ip-172-31-3-100 ~]$
bit 指定
-b でbit 指定。今なら 2048bit 以上が推奨。
[centos@ip-172-31-3-100 ~]$ ssh-keygen -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/home/centos/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/centos/.ssh/id_rsa. Your public key has been saved in /home/centos/.ssh/id_rsa.pub. The key fingerprint is: da:02:a4:c1:7b:2b:d7:f7:19:1c:15:7f:bf:00:79:06 centos@ip-172-31-3-100 The key's randomart image is: +--[ RSA 4096]----+ | E. | | . oo | | o . o.o. .| | = .+ ..| | o o S . . .| | . + o . . . .| | . o + o o . | | o o . o | | o | +-----------------+ [centos@ip-172-31-3-100 ~]$
鍵の種類の指定
SSH1 しか使えないような環境であれば、rsa1 を指定*1。それ以外であれば、rsa で問題なし。
[centos@ip-172-31-3-100 ~]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/centos/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/centos/.ssh/id_rsa. Your public key has been saved in /home/centos/.ssh/id_rsa.pub. The key fingerprint is: 68:d2:72:a3:65:33:dd:16:1f:59:82:a2:5c:33:f0:a6 centos@ip-172-31-3-100 The key's randomart image is: +--[ RSA 2048]----+ | .. .. . | | .= . + | | . oo+. o | | .o= . o . | | o E S o . | | O + . | | . | | | | | +-----------------+ [centos@ip-172-31-3-100 ~]$
ワンライナー
-q で標準出力無効、-f で鍵の保存場所、-N でパスフレーズを指定出来る。
[centos@ip-172-31-3-100 ~]$ ssh-keygen -q -f /home/centos/.ssh/id_rsa -N hogehoge [centos@ip-172-31-3-100 ~]$
管理
パスワード変更
既存の鍵ファイルのパスワード変更。-f で古い秘密鍵ファイルを指定していますが、指定なければ対話式でファイルパスを入力します。
[centos@ip-172-31-3-100 ~]$ ssh-keygen -p -f /home/centos/.ssh/id_rsa. Enter old passphrase: Key has comment '/home/centos/.ssh/id_rsa.' Enter new passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved with the new passphrase. [centos@ip-172-31-3-100 ~]$
公開鍵の再生成
秘密鍵から公開鍵を再生成する。-f オプションがなくした場合はファイルパスを聞かれます。
[centos@ip-172-31-3-100 ~]$ ssh-keygen -y -f /home/centos/.ssh/id_rsa ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtzibgUiUJs/MOO/Jl1Xt3ZcEhcHdQWJ8pv4WV1/WYXTMZYS7pEE+PmnegefV3Nf/3wgRePJf7Ac2myheTeFe8hnzw6UT8Hzs8Ijg8XB0YKeUFh2vSKnK1cTTW6ZgA9GA3KEm1EMqakgXCMgQjdCtM2Vn+eTIUvY7WHOyzrOrRmP+l4OWOOc6Y7tagiEdMAymcW5DQl4FU0kk7HQBHTC05naw1Rz7DkcYVdZ74od5lfMlqgfAlTZwqOIPSt5y7paxbRzhjci1CqEyf8JAjvH7AiPudpDTR/eT4hZtmlMuM8XM4kZDMhBu5Y9umzdyuIpVwMOVJecFBXEvO0xMBMdPOQ== [centos@ip-172-31-3-100 ~]$
まとめ
鍵生成程度なら、TereTermやPutty単体でも作成出来る。 もっと知りたい人は、man ssh-keygen で!
alternatives コマンドによる複数バージョンの使い分け
はじめに
AmazonLinuxでは、各種ソフトウェアが複数バージョンで用意されている事が多いです。
一例を上げると、Java,ruby,python などがあります。
[root@ip-172-31-11-130 ~]# ruby ruby ruby2.0 ruby2.3 [root@ip-172-31-11-130 ~]# ruby -v ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux-gnu] [root@ip-172-31-11-130 ~]#
この場合、ruby2.3をアンインストールしないと /usr/bin/ruby を使って ruby2.0 が使えないのかというとそんなことはありません。
alternatives コマンドによる切り替え
[root@ip-172-31-11-130 ~]# ll /usr/bin/ruby* lrwxrwxrwx 1 root root 22 Jun 10 16:26 /usr/bin/ruby -> /etc/alternatives/ruby -rwxr-xr-x 1 root root 5592 Jan 14 21:04 /usr/bin/ruby2.0 -rwxr-xr-x 1 root root 5576 Feb 24 22:23 /usr/bin/ruby2.3 [root@ip-172-31-11-130 ~]# ll /etc/alternatives/ruby lrwxrwxrwx 1 root root 16 Jun 10 16:26 /etc/alternatives/ruby -> /usr/bin/ruby2.3 [root@ip-172-31-11-130 ~]#
このコマンド結果の通り、シンボリックリンクで実体の向け先を変えている事がわかります。 この向け先変更を行うコマンドが alternatives です。
類似するソフトウェアの切り替えなどで使われていましたが、こういうケースでも利用出来ます(sendmail,postfixの切り替えなど)。
変更方法
今回試しているAmazonLinuxの環境では、ruby2.0とruby2.3のパッケージをインストールしています。
[root@ip-172-31-11-130 ~]# alternatives --display ruby ruby - status is manual. link currently points to /usr/bin/ruby2.3 /usr/bin/ruby2.0 - priority 2000 slave erb: /usr/bin/erb2.0 slave gem: /usr/bin/gem2.0 slave irb: /usr/bin/irb2.0 slave rake: /usr/bin/rake2.0 slave rdoc: /usr/bin/rdoc2.0 slave ri: /usr/bin/ri2.0 slave testrb: /usr/bin/testrb2.0 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.0.pc slave erb.1: /usr/share/man/man1/erb2.0.1.gz slave irb.1: /usr/share/man/man1/irb2.0.1.gz slave rake.1: /usr/share/man/man1/rake2.0.1.gz slave ri.1: /usr/share/man/man1/ri2.0.1.gz slave ruby.1: /usr/share/man/man1/ruby2.0.1.gz /usr/bin/ruby2.3 - priority 230 slave erb: /usr/bin/erb2.3 slave gem: /usr/bin/gem2.3 slave irb: /usr/bin/irb2.3 slave rake: /usr/bin/rake2.3 slave rdoc: /usr/bin/rdoc2.3 slave ri: /usr/bin/ri2.3 slave testrb: (null) slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.3.pc slave erb.1: /usr/share/man/man1/erb2.3.1.gz slave irb.1: /usr/share/man/man1/irb2.3.1.gz slave rake.1: /usr/share/man/man1/rake2.3.1.gz slave ri.1: /usr/share/man/man1/ri2.3.1.gz slave ruby.1: /usr/share/man/man1/ruby2.3.1.gz Current `best' version is /usr/bin/ruby2.0. [root@ip-172-31-11-130 ~]#
--display でどちらのrubyが使われているかがわかります。また、表示されているように各種ライブラリなども切り替わります。gemもちゃんと切り替わってくれるので安心ですね。
[root@ip-172-31-11-130 ~]# alternatives --config ruby There are 2 programs which provide 'ruby'. Selection Command ----------------------------------------------- * 1 /usr/bin/ruby2.0 + 2 /usr/bin/ruby2.3 Enter to keep the current selection[+], or type selection number: 1 [root@ip-172-31-11-130 ~]#
--config で切り替える事が出来ます。
[root@ip-172-31-11-130 ~]# ruby -v ruby 2.0.0p648 (2015-12-16) [x86_64-linux] [root@ip-172-31-11-130 ~]#
ちゃんとバージョンが変わっていますね。
ちなみに、--display で再度確認してみると全て切り替わっている事が分かります。
[root@ip-172-31-11-130 ~]# alternatives --display ruby ruby - status is manual. link currently points to /usr/bin/ruby2.0 /usr/bin/ruby2.0 - priority 2000 slave erb: /usr/bin/erb2.0 slave gem: /usr/bin/gem2.0 slave irb: /usr/bin/irb2.0 slave rake: /usr/bin/rake2.0 slave rdoc: /usr/bin/rdoc2.0 slave ri: /usr/bin/ri2.0 slave testrb: /usr/bin/testrb2.0 slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.0.pc slave erb.1: /usr/share/man/man1/erb2.0.1.gz slave irb.1: /usr/share/man/man1/irb2.0.1.gz slave rake.1: /usr/share/man/man1/rake2.0.1.gz slave ri.1: /usr/share/man/man1/ri2.0.1.gz slave ruby.1: /usr/share/man/man1/ruby2.0.1.gz /usr/bin/ruby2.3 - priority 230 slave erb: /usr/bin/erb2.3 slave gem: /usr/bin/gem2.3 slave irb: /usr/bin/irb2.3 slave rake: /usr/bin/rake2.3 slave rdoc: /usr/bin/rdoc2.3 slave ri: /usr/bin/ri2.3 slave testrb: (null) slave ruby.pc: /usr/lib64/pkgconfig/ruby-2.3.pc slave erb.1: /usr/share/man/man1/erb2.3.1.gz slave irb.1: /usr/share/man/man1/irb2.3.1.gz slave rake.1: /usr/share/man/man1/rake2.3.1.gz slave ri.1: /usr/share/man/man1/ri2.3.1.gz slave ruby.1: /usr/share/man/man1/ruby2.3.1.gz Current `best' version is /usr/bin/ruby2.0. [root@ip-172-31-11-130 ~]#
まとめ
AmazonLinuxのパッケージを利用したメジャーバージョンアップでも使えるかもしれないですね。 なお、自分でビルドしたrubyパッケージを対象にしたい場合は自分で管理対象に追加する必要があります。
詳しくは、下記参考ページがとても詳細に解説されています。 alternatives による標準コマンドの切り替え
Install Jenkins on Amazon Linux
はじめに
JenkinsをAmazon Linuxにインストールした際のメモ
EC2作成
Jenkins requires Java7 or above to function. Java8 is recommended. Jenkins requires a fair amount of memory to operate well. Smaller installations should start around 256MB-1GB.
256MBから1GBとあるので t2.micro で作成し必要に応じてスペック変更を行います。
やっておくべきこと
- Jenkinsはデフォルトで tcp/8080 を使うのでSecurityGroupで開放しておく
- IAM roleの権限を最小限で良いので作成時に割り当てておく
インストール
パッケージが提供されているので、yumコマンドでインストール出来ます。
Jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key sudo yum install jenkins
Java
AmazonLinuxにOpenJDK 1.7 が既にインストール済みなので、そのまま利用
起動
sudo service jenkins start/stop/restart sudo chkconfig jenkins on
初期パスワードの確認
cat /var/lib/jenkins/secrets/initialAdminPassword
まとめ
http://IPアドレス:8080
にアクセスして、下記画面が表示されたら確認した初期パスワードでログイン
あとは必要に応じてプラグインのインストールを行ってください。
パッケージ化されているので、非常に簡単ですね。それでは、良い CI を!
参考
NFSの統計情報
はじめに
メモ書きです。間違っている箇所があるかもしれませんが、ご容赦ください。
調査方法
クライアントとサーバ側でそれぞれ取得出来る情報でわけてみます。
NFSクライアント
nfsstat
nfsstatコマンドは、NFS の統計情報を表示するコマンドです。オプションを使い分ける事で、サーバ側とクライアント側の統計情報を見る事が出来ます。
/proc/net/rpc/nfs のデータを利用しています。
オプションの意味
-s サーバ側の統計のみを表示する。デフォルトではサーバとクライアント両者の統計を表示する。 -c クライアント側の統計のみを表示する。 -n NFS の統計のみを表示する。デフォルトでは NFS と RPC 両者の情報を表示する。 -r RPC の統計のみを表示する。
# nfsstat -c Client rpc stats: calls retrans authrefrsh 450 2 452 Client nfs v4: null read write commit open open_conf 0 0% 56 0% 40 0% 0 0% 48 0% 19 0% open_noat open_dgrd close setattr fsinfo renew 0 0% 0 0% 585996 0% 36112 0% 6 0% 0 0% setclntid confirm lock lockt locku access 1 0% 1 0% 616957 0% 0 0% 35 0% 2 0% getattr lookup lookup_root remove rename link 865149 0% 6130763 2% 2 0% 8 0% 13 0% 0 0% symlink create pathconf statfs readlink readdir 0 0% 1 0% 4 0% 584 0% 0 0% 623 94% server_caps delegreturn getacl setacl fs_locations rel_lkowner 10 0% 0 0% 0 0% 0 0% 0 0% 598877 0% secinfo exchange_id create_ses destroy_ses sequence get_lease_t 0 0% 0 0% 0 0% 0 0% 0 0% 0 0% reclaim_comp layoutget getdevinfo layoutcommit layoutreturn getdevlist 0 0% 0 0% 0 0% 0 0% 0 0% 0 0% (null) 0 0% #
# cat /proc/net/rpc/nfs net 0 0 0 0 rpc 662 2 484 proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 proc3 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 proc4 48 0 75 15 0 59 55 0 0 708 04 6 0 1 1 57 0 55 4 23 48 2 13 11 0 0 1 4 56 0 783 10 0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0 #
-m オプションを使う事で、マウントポジションのオプションもわかる
# nfsstat -m /var/www from 192.168.1.1:/var/www Flags: rw,relatime,vers=4,rsize=8192,wsize=8192,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.2,minorversion=0,local_lock=none,addr=192.168.1.1 #
nfsiostat
nfsiostatコマンドは、マウントポジション毎の iostat をエミュレートしてくれるコマンドです。 普段から iostat を見ている人であれば、馴染みやすいですね。
# nfsiostat 1 192.168.1.1:/var/www: op/s rpc bklog 1499.72 0.00 read: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 4.787 21.138 4.415 0 (0.0%) 2.601 2.750 write: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 4.047 21.863 5.403 0 (0.0%) 27.929 27.960 192.168.1.1:/var/www: op/s rpc bklog 0.00 0.00 read: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 0.000 0.000 0.000 0 (0.0%) 0.000 0.000 write: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 0.000 0.000 0.000 0 (0.0%) 0.000 0.000 192.168.1.1:/var/www: op/s rpc bklog 12.00 0.00 read: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 2.000 4.184 2.092 0 (0.0%) 0.000 0.000 write: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 1.000 2.723 2.723 0 (0.0%) 30.000 30.000
見慣れないパラメータの意味。
上から、再送回数、クライアントからRPCリクエストが受信されるまでの平均時間、クライアントからRPCリクエストが完了するまでの時間。
- retrans This is the number of retransmissions. - avg RTT (ms) This is the duration from the time that client's kernel sends the RPC request until the time it receives the reply. - avg exe (ms) This is the duration from the time that NFS client does the RPC request to its kernel until the RPC request is completed, this includes the RTT time above.
サーバ側
nfsstat
クライアント側で紹介した nfsstat コマンドのサーバ側で実行した場合の出力 こちらは /proc/net/rpc/nfsd のデータを利用しています。
$ sudo nfsstat -s Server rpc stats: calls badcalls badclnt badauth xdrcall 629 0 0 0 0 Server nfs v4: null compound 4 0% 608 99% Server nfs v4 operations: op0-unused op1-unused op2-future access close commit 0 0% 0 0% 0 0% 3 0% 6 0% 0 0% create delegpurge delegreturn getattr getfh link 1 0% 0 0% 0 0% 40 1% 42 1% 0 0% lock lockt locku lookup lookup_root nverify 15 0% 0 0% 4 0% 47 1% 0 0% 0 0% open openattr open_conf open_dgrd putfh putpubfh 12 0% 0 0% 3 0% 0 0% 459 48% 0 0% putrootfh read readdir readlink remove rename 4 0% 25 0% 856 46% 0 0% 9 0% 5 0% renew restorefh savefh secinfo setattr setcltid 2 0% 0 0% 5 0% 0 0% 3 0% 3 0% setcltidconf verify write rellockowner bc_ctl bind_conn 3 0% 0 0% 4 0% 17 0% 0 0% 0 0% exchange_id create_ses destroy_ses free_stateid getdirdeleg getdevinfo 0 0% 0 0% 0 0% 0 0% 0 0% 0 0% getdevlist layoutcommit layoutget layoutreturn secinfononam sequence 0 0% 0 0% 0 0% 0 0% 0 0% 0 0% set_ssv test_stateid want_deleg destroy_clid reclaim_comp 0 0% 0 0% 0 0% 0 0% 0 0% $
# cat /proc/net/rpc/nfsd rc 0 2891 2622 fh 0 0 0 0 0 io 2551 1159 th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ra 32 0 0 0 0 0 0 0 0 0 0 0 net 321 0 512 4 rpc 279 0 0 0 0 proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 proc3 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 proc4 2 4 854 proc4ops 59 0 0 0 857 149 0 1 0 0 38 68 0 29 0 86 38 0 0 30 0 2 0 68 0 4 13 28 0 6 25 2 0 15 0 66 3 3 0 18 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #
それぞれの値の見方は下記記事が参考になります。
まとめ
ブログを継続させるのって、難しい!
AWS 認定ソリューションアーキテクト – プロフェッショナル の受験メモ
はじめに
AWSのソリューションアーキテクトのアソシエイトを取得していたのですが、4月で切れるために上位資格であるプロフェッショナルを受験した際のメモです。結果は一応、合格していますが 66% と本当にギリギリでした。
情報収集
AWSの資格全てに言えますが、いわゆる対策本がありません。
出題範囲を確認して、やるべき範囲の確認から始めました。
出題される分野は問題を見た際に、どの分野の問いなのか判断つくように覚えておくと良いと思います。
あとは、既に合格されている方の記事も参考にさせて頂きました。
以下、参考にさせて頂いた方
皆様、ありがとうございました!
サンプル問題
公開されている サンプル問題を解いてみます。
有り難い事に答えも載っているので、サンプル問題の答えとその理由を説明できるようになりましょう。
追加でやった方が良いと思っているのが、他の試験問題のサンプル問題も解いてみる事です。同様に答えと理由が説明できるようになるといいと思います。
ドキュメント参照
AWSのドキュメントは非常に解りやすく書いてあり、普段触るプロダクトでも知らない事に気付けます。 他の皆様が書いてありますが、ドキュメントを読むだけではなく、コンソールから実際に操作してみる事をおすすめします。
Black Belt Tech シリーズも理解を深める助けとなりますが、最終的にはドキュメントが一番だと思います。
模擬試験
途中で疲れて、模擬試験をいきなり申し込んで受けてみました。
ですが、この模擬試験も結構疲れますw
ある程度体調を整えて、受けた方が良いと思います。
受験の際、問いがどの分野に対するものなのかを意識して回答するように意識してみました。
結果は散々でしたが、ここで出題されるプロダクトを最低限覚えておくと良いと思います。これでどのドキュメントを読めば良いかある程度限定できると思います。
AWS Cloud Design Pattern の参照
AWS-CloudDesignPattern でAWSのベストプラクティスを頭に入れました。
各CDPは1ページにうまくまとめられているので、非常に読みやすいですね。業務でも役に立つので、全部覚えると良いと思います。
ホワイトペーパー 参照
私は時間があまりなかった関係で参照出来ていませんが、日本語のホワイトペーパーもあるので最低限そこぐらいは読んでおきましょう。
アソシエイトの受験
どうせ勉強するならと思い、他のアソシエイトも取得しようと考え申し込んで受験しました。結果は2つとも合格でした。
AWS 認定デベロッパー – アソシエイト AWS 認定システムオペレーション(SysOps)アドミニストレーター – アソシエイト
受験当日
試験時間が170分もある試験なので、体調管理が非常に重要です。
後悔する事になるので、間違っても前日に夜更かしするのは避けましょう!
眠くならないように食べ過ぎも注意です。可能なら、試験は午前中とかに入れると集中力も増すと思います。
まとめ
結果はギリギリで合格していますが、正直もう少し高いだろうと思っていたところがありました。なので、間違って覚えている事があると思います。今後はDevOpsの取得を目指して、もう少し勉強してみます。
あと、この試験に合格する人なら他のアソシエイト試験も全部合格すると思いますので、一緒に受けると良いと思います。
おすすめ書籍
CDPの書籍です。業務で触ることが多い人は本で持っておいても損はないと思います。
Linuxの負荷調査
はじめに
前回は負荷について書きました。 chimay.hatenablog.com
今回は、Linux OSにおける各リソースの利用状況の調査方法をまとめてみます。 インフラエンジニアの道具となるためのコマンドがほとんどなので、それぞれのコマンドの特徴を理解して使い分けができるようにしましょう。
負荷調査の流れ
大まかな流れ
- 現状把握
- 原因調査
- 復旧対処
現状把握
まずは、サーバで発生している状況を理解しない事には始まりません。 CPU、メモリ、トラフィック、ディスクの使用率を調査しましょう。
筆者は下記の順番で見る事が多いです。LoadAverageは全体把握のためですが、それ以外の理由は可能性が高いと考えている順番です。
1.LoadAverage
2.CPU使用率
3.メモリ使用率
4.ディスク使用率
5.トラフィック使用率
LoadAverage
まずは、LoadAverageです。 サーバの負荷状態を数値化したようなものだと思ってください。高ければ高いほど、サーバ負荷は高いです。 但し、CPU数に依存するので LoadAverage / CPU数 でサーバ毎に計算してください。
uptime
現在時刻、稼働時間、ログインユーザ数、load average がわかります。
$ uptime 07:53:23 up 1:20, 1 user, load average: 0.00, 0.01, 0.02 $
w
uptime でわかる情報にプラスで、実際にログインしているユーザとログイン元、ログイン時間などがわかります。調査時は、uptime よりも w で済ませる事の方が多いと思います。
※スクリプトでデータを取得する際は uptime の方がデータ加工しやすいです。
$ w 07:01:57 up 28 min, 1 user, load average: 0.00, 0.01, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ec2-user pts/0 xxx.xxx.xxx.xxx 07:00 4.00s 0.00s 0.00s w $
CPU使用率
CPU使用率が高い原因が、CPU不足なのか 処理待ちによる wait値の上昇なのかを見るようにしましょう。
top
出力される情報が多く、リアルタイムで情報が更新されるので 負荷調査時にはよく使われます。オプションが非常に多いので、詳細は割愛します。
$ top top - 08:01:05 up 1:27, 1 user, load average: 0.00, 0.01, 0.02 Tasks: 69 total, 1 running, 68 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.1%sy, 0.0%ni, 99.7%id, 0.1%wa, 0.0%hi, 0.0%si, 0.1%st Mem: 503380k total, 253740k used, 249640k free, 67308k buffers Swap: 0k total, 0k used, 0k free, 90516k cached
sar
このコマンドもオプションを使い分ける事でいろいろな情報を確認出来ます。詳細はそのうち別記事で書きます。リアルタイムで見たい場合は、 1 のオプションを付与しましょう。
※1 は実際には間隔(秒)の指定なので、5 を付与すれば 5秒間隔で出力出来ます。
$ sar Linux 4.1.13-19.31.amzn1.x86_64 (igrashi) 05/03/2016 _x86_64_ (1 CPU) 06:33:15 AM LINUX RESTART 06:40:01 AM CPU %user %nice %system %iowait %steal %idle 06:50:01 AM all 0.00 0.00 0.00 0.01 0.00 99.99 07:00:01 AM all 0.01 0.00 0.01 0.01 0.00 99.97 07:10:01 AM all 0.01 0.00 0.01 0.02 0.00 99.96 07:20:01 AM all 0.00 0.00 0.01 0.01 0.00 99.99 $ sar 1 Linux 4.1.13-19.31.amzn1.x86_64 (labo) 05/03/2016 _x86_64_ (1 CPU) 09:00:30 AM CPU %user %nice %system %iowait %steal %idle 09:00:31 AM all 0.00 0.00 0.00 0.00 0.00 100.00 09:00:32 AM all 0.00 0.00 0.00 0.00 0.00 100.00 09:00:33 AM all 0.99 0.00 0.00 0.00 0.00 99.01 09:00:34 AM all 0.00 0.00 0.00 0.00 0.00 100.00 09:00:35 AM all 0.00 0.00 0.99 0.00 0.00 99.01 09:00:36 AM all 0.00 0.00 0.00 0.00 0.00 100.00 09:00:37 AM all 0.00 0.00 0.00 0.00 0.00 100.00 09:00:38 AM all 0.00 0.00 0.99 0.00 0.00 99.01 ^C $
メモリ使用率
スパップアウトが発生しているかどうかを確認するようにしましょう。
free
Amazon Linuxでは、-a オプションを付与する事をおすすめします。available という列が追加されて表示されます。これは、buffers/cacheの開放できるメモリを含めた空き容量になります。
$ free -a total used free shared buffers cached available Mem: 503380 255532 247848 60 67484 91988 455580 -/+ buffers/cache: 96060 407320 Swap: 0 0 0 $
vmstat
とはいえ、リアルタイムでスパップアウトが発生しているかどうかはこちらのコマンドでの確認になります。si と so がそれぞれスパップインとスパップアウトになります。
※1行目は過去の統計データなので、無視してください。
$ vmstat 1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 247748 67528 91988 0 0 27 3 11 18 0 0 100 0 0 0 0 0 247732 67528 91988 0 0 0 0 13 17 0 0 100 0 0 0 0 0 247732 67528 91988 0 0 0 0 9 12 0 0 100 0 0 0 0 0 247732 67528 91988 0 0 0 0 13 21 0 0 100 0 0 0 0 0 247732 67528 91988 0 0 0 0 12 18 0 0 100 0 0
cat /proc/meminfo
実はいろいろ用意されているコマンドは /proc 配下に格納されている情報を読み込んで整形しているだけだったりします。なので、直接該当ファイルを開いてもOKです。
※当然ですが、意味がわかるかどうかは別にして、こちらの方が情報量は多いです。
$ cat /proc/meminfo MemTotal: 503380 kB MemFree: 247716 kB MemAvailable: 455520 kB Buffers: 67552 kB Cached: 91988 kB SwapCached: 0 kB Active: 133556 kB Inactive: 43148 kB Active(anon): 17164 kB Inactive(anon): 52 kB Active(file): 116392 kB Inactive(file): 43096 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 17184 kB Mapped: 15804 kB Shmem: 60 kB Slab: 67904 kB SReclaimable: 58876 kB SUnreclaim: 9028 kB KernelStack: 1376 kB PageTables: 2540 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 251688 kB Committed_AS: 65324 kB VmallocTotal: 34359738367 kB VmallocUsed: 1560 kB VmallocChunk: 34359732383 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 22528 kB DirectMap2M: 501760 kB $
ディスク使用率
意外と100%になるディスク使用率。100%になると、新しいファイルの生成が出来なくなるのでシステムの挙動がおかしくなります。なので、確実に確認はしておきましょう。
df
使用量を確認する事が出来ます。ついでに、i-node も確認すると尚良。
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.8G 3.7G 4.0G 49% / devtmpfs 237M 56K 237M 1% /dev tmpfs 246M 0 246M 0% /dev/shm $ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/xvda1 524288 165728 358560 32% / devtmpfs 60669 430 60239 1% /dev tmpfs 62922 1 62921 1% /dev/shm $
iostat
リアルタイムでI/O状況の確認には、iostatを利用しましょう。先程紹介した、vmstat の bi と bo を見ることでもI/Oを確認する事が出来ます。
$ iostat Linux 4.1.13-19.31.amzn1.x86_64 (labo) 05/03/2016 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.08 0.00 0.05 0.09 0.08 99.70 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn xvda 3.06 53.48 13.99 388969 101776 $
トラフィック使用率
sar -n DEV
sar のオプションの1つで過去のトラフィック値を確認出来ます。こちらもオプションに 1 を付与する事でリアルタイムで確認する事が出来ます。
$ sar -n DEV Linux 4.1.13-19.31.amzn1.x86_64 (igrashi) 05/03/2016 _x86_64_ (1 CPU) 06:33:15 AM LINUX RESTART 06:40:01 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 06:50:01 AM eth0 0.11 0.11 0.01 0.01 0.00 0.00 0.00 06:50:01 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:00:01 AM eth0 0.12 0.12 0.01 0.01 0.00 0.00 0.00 07:00:01 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:10:01 AM eth0 0.24 0.24 0.02 0.03 0.00 0.00 0.00 07:10:01 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07:20:01 AM eth0 0.10 0.10 0.01 0.01 0.00 0.00 0.00 07:20:01 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
ifstat
リアルタイムの確認には、ifstat などもあります。
$ ifstat #kernel Interface RX Pkts/Rate TX Pkts/Rate RX Data/Rate TX Data/Rate RX Errs/Drop TX Errs/Drop RX Over/Rate TX Coll/Rate lo 2 0 2 0 140 0 140 0 0 0 0 0 0 0 0 0 eth0 8495 0 6041 0 5656K 0 1769K 0 0 0 0 0 0 0 0 0 $
ifstatus
視覚的に判りやすいのコマンドでは、ifstatus などがあります。 テキストだと解りづらいので、キャプチャです。
原因調査
ある程度リソースの利用状況がわかったら、次はそれを引き起こしている原因(プロセス)の特定です。
ps
psコマンドでは各プロセス毎のリソースの利用状況がわかるので、前もって調べておいた情報を元に特定しましょう。
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.4 19644 2496 ? Ss 06:33 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 06:33 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 06:33 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 06:33 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? S 06:33 0:00 [kworker/u30:0] root 7 0.0 0.0 0 0 ? S 06:33 0:00 [rcu_sched] root 8 0.0 0.0 0 0 ? S 06:33 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 06:33 0:00 [migration/0] root 10 0.0 0.0 0 0 ? S< 06:33 0:00 [khelper] root 11 0.0 0.0 0 0 ? S 06:33 0:00 [kdevtmpfs] root 12 0.0 0.0 0 0 ? S< 06:33 0:00 [netns] root 13 0.0 0.0 0 0 ? S< 06:33 0:00 [perf] root 14 0.0 0.0 0 0 ? S 06:33 0:00 [kworker/u30:1] root 16 0.0 0.0 0 0 ? S 06:33 0:00 [xenwatch] root 21 0.0 0.0 0 0 ? S 06:33 0:00 [xenbus] root 22 0.0 0.0 0 0 ? S 06:33 0:00 [kworker/0:1] root 124 0.0 0.0 0 0 ? S 06:33 0:00 [khungtaskd] root 125 0.0 0.0 0 0 ? S< 06:33 0:00 [writeback] root 127 0.0 0.0 0 0 ? SN 06:33 0:00 [ksmd] root 128 0.0 0.0 0 0 ? S< 06:33 0:00 [crypto] root 129 0.0 0.0 0 0 ? S< 06:33 0:00 [kintegrityd] root 130 0.0 0.0 0 0 ? S< 06:33 0:00 [bioset] root 132 0.0 0.0 0 0 ? S< 06:33 0:00 [kblockd] root 479 0.0 0.0 0 0 ? S< 06:33 0:00 [md] root 610 0.0 0.0 0 0 ? S 06:33 0:00 [kswapd0] root 681 0.0 0.0 0 0 ? S 06:33 0:00 [fsnotify_mark] root 696 0.0 0.0 0 0 ? S< 06:33 0:00 [kthrotld] root 740 0.0 0.0 0 0 ? S< 06:33 0:00 [deferwq] root 1366 0.0 0.0 0 0 ? S< 06:33 0:00 [ata_sff] root 1380 0.0 0.0 0 0 ? S 06:33 0:00 [scsi_eh_0] root 1381 0.0 0.0 0 0 ? S< 06:33 0:00 [scsi_tmf_0] root 1391 0.0 0.0 0 0 ? S 06:33 0:00 [scsi_eh_1] root 1392 0.0 0.0 0 0 ? S< 06:33 0:00 [scsi_tmf_1] root 1457 0.0 0.0 0 0 ? S 06:33 0:00 [jbd2/xvda1-8] root 1458 0.0 0.0 0 0 ? S< 06:33 0:00 [ext4-rsv-conver] root 1489 0.0 0.0 0 0 ? S< 06:33 0:00 [kworker/0:1H] root 1501 0.0 0.5 11464 2736 ? Ss 06:33 0:00 /sbin/udevd -d root 1591 0.0 0.0 0 0 ? S< 06:33 0:00 [kpsmoused] root 1632 0.0 0.4 11460 2172 ? S 06:33 0:00 /sbin/udevd -d root 1646 0.0 0.0 0 0 ? S 06:33 0:00 [kworker/0:3] root 2080 0.0 0.0 0 0 ? S 06:33 0:00 [kauditd] root 2088 0.0 0.4 15936 2384 ? Ss 06:33 0:00 crond root 2121 0.0 0.0 0 0 ? S< 06:33 0:00 [ipv6_addrconf] root 2252 0.0 0.4 9360 2240 ? Ss 06:33 0:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0 root 2293 0.0 0.3 46536 1964 ? S<sl 06:33 0:00 auditd root 2311 0.0 0.5 243236 2584 ? Sl 06:33 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 2327 0.0 0.0 4380 88 ? Ss 06:33 0:00 rngd --no-tpm=1 --quiet rpc 2341 0.0 0.4 35292 2252 ? Ss 06:33 0:00 rpcbind rpcuser 2358 0.0 0.6 39860 3308 ? Ss 06:33 0:00 rpc.statd dbus 2389 0.0 0.0 21792 228 ? Ss 06:33 0:00 dbus-daemon --system root 2421 0.0 1.3 152080 6820 ? S 06:33 0:00 /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid root 2484 0.0 0.5 77816 2572 ? Ss 06:33 0:00 /usr/sbin/sshd ntp 2509 0.0 0.8 29292 4368 ? Ss 06:33 0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g root 2584 0.0 1.2 92948 6424 ? Ss 06:33 0:00 /usr/libexec/postfix/master postfix 2591 0.0 1.3 93200 6552 ? S 06:33 0:00 qmgr -l -t fifo -u nobody 2593 0.0 0.7 159124 3720 ? Ss 06:33 0:00 proftpd: (accepting connections) root 2618 0.0 0.3 6460 1616 ttyS0 Ss+ 06:33 0:00 /sbin/agetty ttyS0 9600 vt100-nav root 2620 0.0 0.2 4312 1492 tty1 Ss+ 06:33 0:00 /sbin/mingetty /dev/tty1 root 2623 0.0 0.2 4312 1444 tty2 Ss+ 06:33 0:00 /sbin/mingetty /dev/tty2 root 2625 0.0 0.2 4312 1388 tty3 Ss+ 06:33 0:00 /sbin/mingetty /dev/tty3 root 2627 0.0 0.2 4312 1392 tty4 Ss+ 06:33 0:00 /sbin/mingetty /dev/tty4 root 2629 0.0 0.2 4312 1488 tty5 Ss+ 06:33 0:00 /sbin/mingetty /dev/tty5 root 2631 0.0 0.3 10876 1628 ? S 06:33 0:00 /sbin/udevd -d root 2632 0.0 0.2 4312 1408 tty6 Ss+ 06:33 0:00 /sbin/mingetty /dev/tty6 root 2689 0.0 1.3 117784 6712 ? Ss 07:00 0:00 sshd: ec2-user [priv] ec2-user 2691 0.0 1.1 117784 5652 ? S 07:00 0:00 sshd: ec2-user@pts/0 ec2-user 2692 0.0 0.6 115348 3288 pts/0 Ss 07:00 0:00 -bash postfix 2907 0.0 1.3 93032 6584 ? S 08:13 0:00 pickup -l -t fifo -u ec2-user 3050 0.0 0.6 115348 3396 pts/0 S 08:22 0:00 bash ec2-user 3220 0.0 0.4 117204 2460 pts/0 R+ 08:44 0:00 ps aux $
netstat
トラフィックの場合は、netstat コマンドで接続が多いプロセスを特定しましょう。下記のようなオプションで、PIDも出力する事が出来ます。
$ sudo netstat -anep Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 10059 2484/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 10309 2584/master tcp 0 0 0.0.0.0:33410 0.0.0.0:* LISTEN 29 9566 2358/rpc.statd tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 0 9825 2421/snmpd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 0 9488 2341/rpcbind tcp 0 464 172.31.15.196:22 xxx.xxx.xxx.xxx:19752 ESTABLISHED 0 12759 2689/sshd tcp 0 0 :::21 :::* LISTEN 99 10425 2593/proftpd tcp 0 0 :::22 :::* LISTEN 0 10061 2484/sshd tcp 0 0 :::39943 :::* LISTEN 29 9572 2358/rpc.statd tcp 0 0 :::111 :::* LISTEN 0 9491 2341/rpcbind udp 0 0 0.0.0.0:820 0.0.0.0:* 0 9487 2341/rpcbind udp 0 0 0.0.0.0:68 0.0.0.0:* 0 8856 2252/dhclient udp 0 0 127.0.0.1:838 0.0.0.0:* 0 9560 2358/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 0 9486 2341/rpcbind udp 0 0 172.31.15.196:123 0.0.0.0:* 0 10144 2509/ntpd udp 0 0 127.0.0.1:123 0.0.0.0:* 0 10143 2509/ntpd udp 0 0 0.0.0.0:123 0.0.0.0:* 0 10136 2509/ntpd udp 0 0 0.0.0.0:161 0.0.0.0:* 0 9824 2421/snmpd udp 0 0 0.0.0.0:47782 0.0.0.0:* 29 9563 2358/rpc.statd udp 0 0 :::820 :::* 0 9490 2341/rpcbind udp 0 0 :::52050 :::* 29 9569 2358/rpc.statd udp 0 0 :::111 :::* 0 9489 2341/rpcbind udp 0 0 fe80::4b2:53ff:fe38:5837:123 :::* 0 10146 2509/ntpd udp 0 0 ::1:123 :::* 0 10145 2509/ntpd udp 0 0 :::123 :::* 0 10137 2509/ntpd
復旧対処
調査の結果わかった内容で対策を考えましょう。
まとめ
こんなに書いといてあれですが、実際には、いきなり ps コマンドで特定する事の方が多いかもしれません。
また、サーバにログインして確認するコマンドを紹介しましたが、実際の運用では可能な限りモニタリングツールを導入してサーバへのログインなしに確認できる環境を作りましょう。サーバが複数台の環境だとコマンドで見るよりもグラフを見た方が何倍も判りやすく、早い解決が期待出来ます。
おすすめ書籍
より詳しい内容は下記書籍が初心者にもわかりやすいと思います。今回の内容だと特に最初の1冊をお勧めします。