■由来
参考:Linuxコマンドは単語の意味を理解するとグッと身近なものになる http://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02 参考:新版 UNIX/Linux 由来/読み方辞書 http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html
■ファイル・ディレクトリ操作
■ディレクトリ移動 $ cd … ホームディレクトリへ移動 $ cd - … 直前のディレクトリへ移動 ■ファイルサイズを適当な単位で表示 $ ll 合計 72 -rwxrwxr-x 1 refirio refirio 6424 5月 4 21:49 2016 test -rw-rw-r-- 1 refirio refirio 82 5月 4 21:40 2016 test.c -rw-rw-r-- 1 refirio refirio 1504 5月 4 21:43 2016 test.o -rw-rw-r-- 1 refirio refirio 444 5月 4 21:41 2016 test.s $ ll -h 合計 72K -rwxrwxr-x 1 refirio refirio 6.3K 5月 4 21:49 2016 test -rw-rw-r-- 1 refirio refirio 82 5月 4 21:40 2016 test.c -rw-rw-r-- 1 refirio refirio 1.5K 5月 4 21:43 2016 test.o -rw-rw-r-- 1 refirio refirio 444 5月 4 21:41 2016 test.s ■ファイルの表示に便利 $ less 参考:コマンド less ファイル表示プログラム (ページャ) http://x68000.q-e-d.net/~68user/unix/pickup?less 参考:インフラエンジニアとしてよく使うコマンド集 http://qiita.com/sion_cojp/items/04a2aa76a1021fe77079 ■ファイルを作成 $ touch test.txt … test.txt を作成 $ touch `date +%Y%m%d_%H-%M-%S`.txt … 日時をファイル名としたファイル(20160905_13-26-19.txt など)を作成 ■ファイルを複製 $ cp test1.txt test2.txt ■ファイル名を変更(ファイルを移動) $ mv test1.txt test2.txt ■ファイルを一括移動 $ mv /var/www/vhosts/xxx/html/* /var/www/vhosts/yyy/html ■ファイルを削除 $ rm test.txt … test.txt を削除 $ rm test_*.txt … ワイルドカードで一括削除 $ rm -f test_*.txt … 確認なしに削除 ■ファイルのタイムスタンプを変更 $ touch -t 201504201230 test.txt … test.txtのタイムスタンプを2015年4月20日の12:30に設定 ■ファイルを検索 $ find ./ -mtime -11 -ls … 更新日が10日以内のファイルを表示 $ find ./ -mtime +7 -and -mtime -15 -ls … 更新日が一週間前より古くて二週間前より新しい mtimeはファイルの更新日時 ctimeはファイル名やパーミッションなども含めた更新日時 参考:UNIXの部屋 コマンド: タイムスタンプ http://x68000.q-e-d.net/~68user/unix/pickup?%A5%BF%A5%A4%A5%E0%A5%B9%A5%BF%A5%F3%A5%D7 -11 ... 10日以内 +10 ... 10日以前 10 ... 10日前 +365 ... 一年間更新されていない -8 ... 一週間以内に変更された 7 ... 一週間前に更新された $ find ./ -type f -print | xargs grep 'ABC' … 文字列「ABC」が含まれるファイルを表示 参考:xargsでfindの結果をgrepに渡している https://hydrocul.github.io/wiki/commands/xargs.html $ grep -r "検索したい文字" ./ $ grep -r -i -E "正規表現で検索したい文字" ./ grepでもファイルを検索できる。rでディレクトリから検索、Eで正規表現、iで大文字小文字を区別しない # find / -name php.ini … 「php.ini」ファイルの場所を表示 $ find ./ -name test.txt -ls … ファイル名が「test.txt」のファイルを検索 $ find ./ -name test* -ls … ファイル名が「test」から始まるファイルを検索 参考:find http://codezine.jp/unixdic/w/find 参考:【linux】更新日が最近のファイルを見つける(findコマンド) https://www.softel.co.jp/blogs/tech/archives/1332 参考:【Linux】複数あるファイルの中から特定の文字列を検索するコマンド http://kawatama.net/web/1141 参考:お仕事で知っておけば便利。コマンドを叩くだけで使えるワンライナーチートシート http://qiita.com/taiyop/items/bfeeb41259cb0d083d88 参考:The Silver Searcher のススメ http://qiita.com/thermes/items/e1e0c94e2875df96921c ■ディスク使用量を確認 # df … ディスク使用量を確認 ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 devtmpfs 1014716 56 1014660 1% /dev tmpfs 1025652 0 1025652 0% /dev/shm /dev/xvda1 264090608 166642180 97348180 64% / # df -h … ディスク使用量を確認(見やすい単位で表示) ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 991M 56K 991M 1% /dev tmpfs 1002M 0 1002M 0% /dev/shm /dev/xvda1 252G 159G 93G 64% / ■ファイル数とディレクトリ数を数える $ ls -laR | grep -c '^-' … 合計ファイル数 $ ls -laR | egrep -c '^d.+[^.]$' … 合計ディレクトリ数 参考:あるディレクトリ以下の合計ファイル数を再帰的に知るunixコマンド http://logic.moo.jp/data/archives/336.html ■サイズの大きいファイルを検索 # du -s /* | sort -nr … ストレージサイズの大きい領域を表示 4194312 /mnt … メモリのスワップに4GBを割り当てている場合 1281572 /usr 616296 /var 142244 /lib 62628 /boot 以下のようにして、容量を圧迫している箇所を探っていく # du -s /* | sort -nr # du -s /var/* | sort -nr # du -s /var/www/* | sort -nr # du -s /var/www/html/* | sort -nr 以下のように -h をつけると、ファイルサイズを適当な単位で表示してくれる # ll -h /var/www/html/ ■所有者と権限を変更 # chown apache. /var/www/html/test … ディレクトリの所有者をapacheに変更 # chown -R apache. /var/www/html/test … ディレクトリの所有者をapacheに変更(再帰的) # chmod 775 /var/www/html/test … 権限を775に変更 # chmod -R 775 /var/www/html/test … 権限を775に変更(再帰的) # find /var/www/html/test -type d -print | xargs chmod 775 … ディレクトリのみ権限を775に変更(再帰的) # find /var/www/html/test -type f -print | xargs chmod 664 … ファイルのみ権限を664に変更(再帰的) 参考:find + chmodでパーミッションの一括変更 http://ext.omo3.com/webmaster/chmod.html ■ファイル作成時の所属グループを、親ディレクトリのグループにする # chmod g+s /var/www/html/test 参考:ファイル作成時の所属グループを、ディレクトリのグループに設定する http://qiita.com/ritukiii/items/bbb34c372ce35ec55679 ■ディレクトリを作成 $ mkdir test … ディレクトリを作成 $ cd $_ … 作成したディレクトリに移動 「$_」で、ひとつ前に実行したコマンドラインの最後の引数を参照できる もしくは、「ESC → .」で直前のコマンドの最後のパラメータを補完できる 参考:[小ネタ] mkdir したディレクトリに cd する方法 9 選 +1 (BASH) | Developers.IO http://dev.classmethod.jp/etc/make-and-cd-patterns/ ■ディレクトリ名を変更 $ mv test1 test2 ■ディレクトリを複製 $ cp test test_backup … 「cp: omitting directory `test'」と表示され、コピーできない $ cp -r test test_backup … ディレクトリをコピーする際は「r」オプションを付ける $ cp -rp test test_backup … pオプションも付けると、コピー元の所有者ID、グループID、アクセス権、最終更新日時、最終アクセス日時をコピー元と同じにしてコピーする 使用例: $ cp -rp /var/www/vhosts/xxx/html/phpmyadmin /var/www/vhosts/yyy/html/phpmyadmin ■ディレクトリを複製(特定ディレクトリを除外) cpでは特定ディレクトリのみ除外して複製することはできないが、rsyncを使えば可能 普通に複製する場合 rsync -a /var/www/vhosts/test/ /var/www/vhosts/test_backup/ /var/www/vhosts/test/ を /var/www/vhosts/test_backup/ に複製するが、 /var/www/vhosts/test/blog/ は除外したい場合、以下のようにする(除外設定は、複製元のパスを基準に指定する) rsync -a /var/www/vhosts/test/ /var/www/vhosts/test_backup/ --exclude '/blog/' 参考:【linux】特定のディレクトリを除いてコピーしたい https://www.softel.co.jp/blogs/tech/archives/5267 ■ディレクトリを移動 $ mv /var/www/vhosts/terraport/html/deploy /var/www/vhosts/main/html $ mv target/ ../ … 一階層上に移動 ■ディレクトリを削除 $ rm -rf ディレクトリ名 $ rm -rf 201603* … ワイルドカードで一括削除 $ rm -rf 20160[3-8]* … 正規表現で一括削除 r ... 中身のファイルも含めてディレクトリごと削除 f ... 確認なしに削除 ■ファイルを圧縮&解凍 $ tar zcvf compress.tar.gz file1 file2 … TAR+GZIP形式で圧縮 $ gzip -dc compress.tar.gz | tar xvf … TAR+GZIP形式で解凍 $ zip -r compress.zip file1 file2 … ZIP形式で圧縮 $ unzip compress.zip … ZIP形式で解凍 解凍後、所有者と権限を調整する場合の例 # chown -R apache compress … 所有者をapacheに変更(再帰的) # find compress -type d -print | xargs chmod 775 … ディレクトリの権限を775に変更(再帰的) # find compress -type f -print | xargs chmod 664 … ファイルの権限を664に変更(再帰的) 古いログを削除する前にバックアップする場合の例 # cd /var/log/command/xxx … 作業ディレクトリへ移動 # zip -r 2016.zip 2016*/ … 「2016」から始まるディレクトリを1つに圧縮 # rm -rf 2016*/ … 「2016」から始まるディレクトリを削除 特定のディレクトリを除外して圧縮 参考:tarで圧縮する時に特定のディレクトリは除外する方法 - ex1-lab https://ex1.m-yabe.com/archives/2145 参考:カゲンぱぱのイイカゲンメモ帳: linuxのzipコマンドで特定フォルダーとファイルを除外する http://kagen88.blogspot.jp/2012/12/linuxzip.html ■ファイルを暗号化&復号化 $ openssl enc -e -aes128 -in plain.txt -out crypted.txt … 暗号化 $ openssl enc -d -aes128 -in crypted.txt -out plain.txt … 復号化 参考:opensslコマンドの使い方: UNIX/Linuxの部屋 http://x68000.q-e-d.net/~68user/unix/pickup?openssl 参考:OpenSSLでファイルの暗号化・複合化するための備忘録 - Qiita https://qiita.com/Yarimizu14/items/49690c141b62507e00d9 参考:opensslコマンドで簡単なファイル暗号化 - Qiita https://qiita.com/ikuwow/items/1cdb057352c06fd3d727
■ファイルのハッシュを確認
https://ja.osdn.net/projects/filezilla/releases/ などにある「ハッシュ」は、ファイルの内容が改ざんされていないか確認するためのもの 以下のような方法でファイルのハッシュを確認できる ■Unix $ md5sum target.txt ac831b62e07eef4d60e778a769d40e2e target.txt $ sha1sum target.txt bd950235476818fcb481e8a29f876b8e5328d380 target.txt $ sha256sum target.txt 1639e3c3377b98ddc5e3adc806f26ef4f2cf6031788ed7d38b6207b1371f6849 target.txt ■Windows PowerShell Get-FileHash target.txt -Algorithm md5 Get-FileHash target.txt -Algorithm sha1 Get-FileHash target.txt -Algorithm sha256 ■PHP <?php echo hash_file('md5', 'target.txt'); echo '<hr>'; echo hash_file('sha1', 'target.txt'); echo '<hr>'; echo hash_file('sha256', 'target.txt');
■コマンド入力
Ctrl+A で入力中の行頭に移動 Ctrl+E で入力中の行末に移動 Ctrl+K でカーソルより行末方向の文字を削除(キルバッファに格納) Ctrl+Y でキルバッファに格納された文字を貼り付け
■コマンド履歴
$ history … 履歴を表示 $ history 10 … 履歴を10件表示 $ !123 … 履歴から123のコマンドを実行 $ !! … 直前のコマンドを実行 Ctrl+R でreverse-i-searchが呼び出される その状態で文字列を入力すると過去のコマンドが履歴から検索され、入力候補として表示される 再度 Ctrl+R でさらに昔の候補が表示される ESCで終了できる 参考:[ターミナル] コマンドの履歴検索と実行 http://dev.classmethod.jp/tool/terminal-reverse-i-search/
■ログを確認
KEIROMICHI | IPアドレスから住所検索 http://keiromichi.com/ IPひろば http://www.iphiroba.jp/ ANSI Whois Gateway http://whois.ansi.co.jp/ 使用中のIPアドレス確認 https://www.cman.jp/network/support/go_access.cgi ■Linux OSが起動した直後からsyslogが起動するまでのログ(dmesgコマンドでも確認できる / 起動してからは /var/log/messages に記録される) # cat /var/log/dmesg システム全般に関するログ # cat /var/log/messages 認証に関するログ # cat /var/log/secure システム起動に関するログ # cat /var/log/boot.log cronに関するログ # cat /var/log/cron メールに関するログ # cat /var/log/maillog yumによるパッケージ情報操作に関するログ # cat /var/log/yum.log ログインに成功したログ(lastコマンドで確認する) # /var/log/wtmp ログインに失敗したログ(lastbコマンドで確認する) # /var/log/btmp 各ユーザーの最後にログインした日時のログ(lastlogコマンドで確認する) # /var/log/lastlog last、lastb、lastlogの結果にIPアドレスは含まれていないが、 /var/log/messages を見ればログインしたときのIPアドレスは判る コマンド一つ一つの実行者のIPアドレスまでは記録されないようだが、実行中に限れば以下の方法で調べることはできる 参考:SSHで接続して処理を実行中のユーザーの接続元IPを確認する方法 http://www.lesstep.jp/wiki/index.php?SSH%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E5%87%A6%E7%90%86%E3%82%92%E5%AE%9F%E8%A1%8C%E4%B8%AD%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E6%8E%A5%E7%B6%9A%E5%85%83IP%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95 ■Apache アクセスログ # cat /var/log/httpd/access_log エラーログ # cat /var/log/httpd/error_log ■vsftpd アクセスログ # cat /var/log/vsftpd.log ■PHP アクセスログ なし(Apacheに依存) エラーログ なし(Apacheに依存) ■MySQL アクセスログ なし(記録していない) エラーログ・アプリケーションログ # cat /var/log/mysqld.log 専用ログ スロークエリログファイル(slow_query_log_file で設定) # cat /var/run/mysqld/mysqld-slow.log mysql> SELECT * FROM mysql.slow_log; ■Zabbix Zabbixサーバのログ # cat /var/log/zabbix/zabbix_server.log Zabbixエージェントのログ # cat /var/log/zabbix/zabbix_agentd.log Zabbixプロキシサーバのログ # cat /var/log/zabbix/zabbix/_proxy.log ■grepの使用例 # tail -n 100 /var/log/secure | grep warning # tail -n 100 /var/log/secure | grep refuse # tail -n 100 /var/log/secure | grep fail # tail -n 100 /var/log/secure | grep error # tail -n 100 /var/log/messages | grep invalid # tail -n 100 /var/log/messages | grep fail # tail -n 100 /var/log/messages | grep error 正規表現で検索 # cat error_log | grep digest # cat error_log | grep done ↓ # cat error_log | egrep '(digest|done)' ■ファイルの監視 # tail -F /var/log/httpd/access_log … 対象ファイルに変更があれば即座に反映 # tail -F /var/log/httpd/access_log | grep /test/ … 対象ファイルから「/test/」を検索。変更があれば即座に反映 # tail -n 5 -F /var/log/httpd/access_log /var/log/httpd/error_log … 複数ファイルを同時に監視(ただしmultitailを使う方が良さそう) 参考:multitailで複数のログを同時に監視 https://rcmdnk.com/blog/2016/03/06/computer-linux-mac/ 参考:複数ファイルを tail できる multitail が便利! http://loumo.jp/wp/archive/20130228202358/ # cd /var/log/httpd # multitail -f access_log -f error_log … 「-f」が「-F」でいいかは要動作確認 参考:[Linux]「tail -f」での監視はもう古い!?超絶便利なlessコマンド http://qiita.com/shuntaro_tamura/items/faaebb3282c37a718b76 参考:tail -fやtailfを使うのはやめてless +Fを使おう http://qiita.com/LOUIS_rui/items/8d935526571ccfe171ae 参考:エンジニアなら知っておきたい lessコマンドtips 11選 http://qiita.com/ine1127/items/64b5b6cf52471c3fe59c 参考:「tail -f」を使うのは情弱、情強は「less +F」を使う http://www.softantenna.com/wp/unix/stop-using-tail-f/
■ログをコピー
Apacheのログ /var/log/httpd/access_log すべてのログを /var/www/logs/ 内にコピーする例 \cp -f /var/log/* /var/www/logs/ \cp -f /var/log/audit/* /var/www/logs/audit/ \cp -f /var/log/conman/* /var/www/logs/conman/ \cp -f /var/log/conman.old/* /var/www/logs/conman.old/ \cp -f /var/log/cups/* /var/www/logs/cups/ \cp -f /var/log/httpd/* /var/www/logs/httpd/ \cp -f /var/log/mail/* /var/www/logs/mail/ \cp -f /var/log/pm/* /var/www/logs/pm/ \cp -f /var/log/ppp/* /var/www/logs/ppp/ \cp -f /var/log/prelink/* /var/www/logs/prelink/ 一部のログを /var/www/logs/ 内にコピーする例 \cp -f /var/log/httpd/access_log /var/www/logs/access_log \cp -f /var/log/httpd/access_log* /var/www/logs/ \cp -f /var/log/httpd/error_log /var/www/logs/error_log \cp -f /var/log/cron /var/www/logs/cron \cp -f /var/log/maillog /var/www/logs/maillog \cp -f /var/log/mysqld.log /var/www/logs/mysqld.log \cp -f /var/log/secure /var/www/logs/secure \cp -f /var/log/vsftpd.log /var/www/logs/vsftpd.log \cp -f /var/log/yum.log /var/www/logs/yum.log パーミッションを変更 chmod 644 /var/www/logs/* 過去のログ \cp -f /var/log/httpd/access_log.1 /var/www/logs/access_log 削除 # rm -f /var/www/logs/*
■Apacheのログをコマンドで解析
※可能なら、最初からcatではなくgrepを使う方が高速。計測方法は「コマンドの実行時間を表示」を参照 ■各項目の参照(cut版とsed版) IPアドレス # cat /var/log/httpd/access_log | cut -d ' ' -f 1 # cat /var/log/httpd/access_log | sed 's/ .*$//' 日時 # cat /var/log/httpd/access_log | cut -d '[' -f 2 | cut -d ']' -f 1 # cat /var/log/httpd/access_log | sed 's/^.*\[\([^]]*\)\].*/\1/' リクエスト # cat /var/log/httpd/access_log | cut -d ' ' -f 7 # cat /var/log/httpd/access_log | sed 's/^[^"]*"\([^"]*\)".*/\1/' リファラー # cat /var/log/httpd/access_log | cut -d '"' -f 4 # cat /var/log/httpd/access_log | sed 's/.*"\([^"]*\)" .*$/\1/' User Agent # cat /var/log/httpd/access_log | cut -d '"' -f 6 # cat /var/log/httpd/access_log | sed 's/.*"\([^"]*\)"$/\1/' ■変換 日時を時間に変換 # cat /var/log/httpd/access_log | cut -d '[' -f 2 | cut -d ']' -f 1 | awk -F : '{print $2":"$3}' ■ソート ※IPアドレスを例に紹介。他の項目の場合も手順は同じ IPアドレス一覧 # cat /var/log/httpd/access_log | cut -d ' ' -f 1 ソート # cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort 重複を除外して件数を表示(重複を除外する前にソートが必要) # cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort | uniq -c 件数の降順にソート # cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr 上位10件 # cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head -n 10 ■除外 CSSや画像などへのアクセスを除外 # cat /var/log/httpd/access_log | egrep -iv '(.css|.js|.gif|.jpeg|.jpg|.jpe|.png|.ico|.swf)' さらにbotからのアクセスを除外 # cat /var/log/httpd/access_log | egrep -iv '(.css|.js|.gif|.jpeg|.jpg|.jpe|.png|.ico|.swf|clawler|Googlebot|googlebot|DotBot|Slurp|msnbot|robots|spider|Wget|ScoutJet|mlbot)' 以下は旧版。grepよりもegrepの方が読みやすい # cat /var/log/httpd/access_log | grep -ive "\(\.css\|\.js\|\.gif\|\.jpeg\|\.jpg\|\.jpe\|\.png\|\.ico\|\.swf\)" # cat /var/log/httpd/access_log | grep -ive "\(\.css\|\.js\|\.gif\|\.jpeg\|\.jpg\|\.jpe\|\.png\|\.ico\|\.swf\|clawler\|Googlebot\|googlebot\|DotBot\|Slurp\|msnbot\|robots\|spider\|Wget\|ScoutJet\|mlbot\)" ■絞り込み 特定ユーザの特定のアクセス # cat /var/log/httpd/access_log | grep '203.0.113.1' | grep '/mypage/profile' 2016年2月10日のみ # cat /var/log/httpd/access_log | grep '10/Feb/2016' 2016年2月10日15時のみ # cat /var/log/httpd/access_log | grep '10/Feb/2016:15' 2016年2月10日15時20〜29分のみ # cat /var/log/httpd/access_log | grep '10/Feb/2016:15:2' 2016年2月10日15時台の、リクエストが多かったページ上位10件 # cat /var/log/httpd/access_log | grep '10/Feb/2016:15' | cut -d ' ' -f 7 | sort | uniq -c | sort -nr | head -n 10 直近の10件のみ # tail -n 10 /var/log/httpd/access_log 直近の1000件の、リクエストが多かったページ上位10件 # tail -n 1000 /var/log/httpd/access_log | cut -d ' ' -f 7 | sort | uniq -c | sort -nr | head -n 10 PDFへのアクセスのみ # cat /var/log/httpd/access_log | egrep -i '(.pdf)' 巨大ファイル(10MB以上)へのアクセスのみ # cat /var/log/httpd/access_log | awk '($10 >= 10000000) {print $0}' ファイル名を表示 # cat /var/log/httpd/access_log | awk '($10 >= 10000000) {print $7}' ファイルサイズとファイル名を表示 # cat /var/log/httpd/access_log | awk '($10 >= 10000000) {print int($10/1024/1024)"MB:"$7}' | uniq | sort -nr エラーのみ # cat /var/log/httpd/access_log | awk '($9 >= 400 || $7 >= 400) {print $0}' エラーの比率 # cat /var/log/httpd/access_log | awk '($9 < 400) {ok++} ($9 >= 400 || $7 >= 400) {ng++} END {print ng/(ok+ng)*100}' ■レスポンスタイム解析 以下のように、ログフォーマットに「%D」が記載されているものとする(レスポンスタイムがマイクロ秒で記録される) LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined ※末尾のデータは「$NF」で参照できるが、例えば末尾からn番目の場合は「$(NF-n)」で参照できる ※1秒 = 1,000ミリ秒 = 1,000,000マイクロ秒 1秒以上かかったレスポンス数 # cat /var/log/httpd/access_log | awk '$NF > 1000000 {print $NF/1000, $7}' | wc -l レスポンスの遅かったリクエストトップ10 # cat /var/log/httpd/access_log | awk '{print $NF/1000, $7}' | sort -nr | head -n 10 平均レスポンスタイム(ミリ秒) # cat /var/log/httpd/access_log | awk '{sum += $NF; count++}; END{print (sum/count)/1000}' 2016年11月5日15時台の、平均レスポンスタイム(ミリ秒) # cat /var/log/httpd/access_log | grep '05/Nov/2016:15' | awk '{sum += $NF; count++}; END{print (sum/count)/1000}' ※例えば以下の形式(末尾から2つ目がレスポンスタイム)で記録されている場合、 LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined 以下のように $(NF-2) と指定すれば解析できる cat /var/log/httpd/access_log | awk '{print $(NF-2)/1000, $7}' | sort -nr | head -n 10 cat /var/log/httpd/access_log | awk '{sum += $(NF-2); count++}; END{print (sum/count)/1000}' cat /var/log/httpd/access_log | grep '05/Nov/2016:15' | awk '{sum += $(NF-2); count++}; END{print (sum/count)/1000}' - - - - - 参考:あなたはだんだん、ファイルを読むのにlessコマンドを使いたくなる http://qiita.com/marrontan619/items/95e954972706f32be255 参考:Apacheのログからエラーアクセスだけ抽出 http://hole.sugutsukaeru.jp/archives/625 参考:Apacheのレスポンス分析に必要なスクリプトまとめ http://koduki.hatenablog.com/entry/2012/11/24/171534 参考:Apacheのログから応答速度分布やエラー状況を分析する(原始的な方法) http://www.teradas.net/archives/5298/ 参考:突然のTwitter砲にもなんとか耐えたさくらVPSに感謝する https://blog.riywo.com/2011/02/07/162154/ 参考:awkで末尾から数えてn番目のフィールドを取り出す。 http://qiita.com/koitatu3/items/3d746c7e292908c6167e ■Apacheのログをツールで解析 参考:【Apache】アクセスログ解析ソフトの一覧 http://matome.naver.jp/odai/2142278136708605501 参考:便利ツール(9)アクセスログ解析ソフト「ApacheLogViewer」 http://win.kororo.jp/weblog/2006/08/17/post_0808.php 参考:「生ログ」を解析してみよう! http://jugemstaff.jugem.jp/?eid=25
■メールのログをコマンドで解析
メールに関するログは /var/log/maillog に記録されている Oct 2 07:44:21 web1 sendmail[21798]: u91MiLhk021798: from=<auto@refirio.net>, size=1528, class=0, nrcpts=1, msgid=<8933a528ed38e17adf4c065ed90c21cb@refirio.net>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1] Oct 2 07:44:21 web1 sendmail[21800]: u91MiLhk021798: to=<taro@example.com>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=121528, relay=iron01.mailgw.jp. [210.171.0.59], dsn=2.0.0, stat=Sent (ok: Message 719393598 accepted) ログの見方は以下を参照 参考:mailログ確認方法 http://support.fsv.jp/manual/analysis/log/check/mail.html ステータスコードとエラーコードは以下を参照 参考:メールのエラーコードと、メールサーバのmaillog解析方法まとめ http://oxynotes.com/?p=9810 上のログからは、以下の情報を読み取れる 日時 ... 10月2日7時44分21秒に送信 ホストサーバー名 ... web1 プロセスの情報 ... sendmailがプロセスID [21798] で処理した メッセージID ... sendmailによってID [u91MiLhk021798] が割り当てられた 送受信者の情報 ... auto@refirio.net から送信された / taro@example.com に送信された メッセージサイズ ... 1528 メッセージ優先度 ... 0 メッセージ受信者数 ... 1 メッセージ識別番号 ... 8933a528ed38e17adf4c065ed90c21cb@refirio.net プロトコル情報 ... ESMTP サーバーデーモン名 ... MTA メッセージ送信サーバ ... localhost [127.0.0.1] リレー先サーバ ... iron01.mailgw.jp ステータス ... dsn=2.0.0, Sent (ok: Message 719393598 accepted) ※「dsn」は「Delivery Status Notifications」の略受信側のサーバが受信状況を送信側に通知する仕組み。「2.0.0」は成功 ※「Sent」は送信したということ ※メールログは1つの処理が複数行からなる。また、処理内容によってログ形式は変わるみたい?要勉強 生ログの解析は大変なので、maillogconvert.plなどを使って変換したログを解析する方が良さそう 参考:Postfix トラブル調査でメールログを調べる手順 http://plumpliver.com/postfix-maillog-procedure
■メールのログをmaillogconvert.plで変換してコマンドで解析
maillogconvert.plを使うと、メールログを読みやすい形式にしてくれる http://hobbit.ddo.jp/awstatsdocs/awstats_tools.html 以下からダウンロードできる https://ja.osdn.net/projects/sfnet_awstats/ 以下はWindows環境での解析例 C:\xampp\perl\bin\perl maillogconvert.pl standard < C:\mail\maillog > mail.log 以下はUnix環境での解析例 perl maillogconvert.pl standard < /var/log/maillog > mail.log ログローテートに注意すること(ローテートされているかは「ll /var/log/ | grep maillog」のようにして調べることができる) 以下のように変換される 2016-10-02 07:44:21 auto@refirio.net taro@example.com localhost mail01.example.com SMTP - 1 1528 変換されたログからは、以下の情報を読み取れる 日時 ... 10月2日7時44分21秒に送信 送受信者の情報 ... auto@refirio.net から taro@example.com に送信された メッセージ送信サーバ ... localhost リレー先サーバ ... mail01.example.com プロトコル情報 ... SMTP SMTPレスポンスコード ... 1 メッセージサイズ ... 1528 PHPから送信したときは、送信者は「apache」になるみたい?次の行もセットで記録されるみたい? 2016-10-02 08:15:59 apache example@docomo.ne.jp localhost 127.0.0.1 SMTP - 1 928 2016-10-02 08:15:59 apache@web1.refirio.net example@docomo.ne.jp localhost mfsmax.docomo.ne.jp SMTP - 1 1151 以下のようなログが大量に記録されているが、中国からのアクセス。リレーメールを拒否した際のログ 2016-10-05 04:07:14 <> example@163.com 183.240.203.45 - SMTP - 550 ? 2016-10-05 04:07:14 example@s.jp example@163.com 183.240.203.45 - SMTP - 550 0 送信元が「<>」なのは送信元が不明なメール。スパムの可能性が高い こういったメールを拒否して運用することは多いが、必要なメールも拒否してしまう可能性はあるので注意 参考:【postfix】envelope-FROMを強制的に付与する http://ameblo.jp/server-study/entry-10270572107.html 変換したmail.logは理由がなければ削除しておく 引き続き、解析方法や集計方法について勉強中 ■SMTPレスポンスコード maillogconvert.plでは、成功時のSMTPレスポンスコードは 1 になるみたい また、原因不明のエラーは 999 になるみたい その他のレスポンスコードは以下を参照 参考:SMTP応答コード http://www.puni.net/~mimori/smtp/reply.html バウンスメールを受け取らなくても、これでメールが届いたかどうかは十分に判る? バウンスメールの本文からしか判らない情報もあるみたい?要勉強 ■コマンドでの解析例 2016年10月2日15時のみ # cat mail.log | grep '2016-10-02 15' 特定の送信元 # cat mail.log | awk '($3 == "apache@aws-terraport.kont5.com") {print $0}' 特定の送信先 # cat mail.log | awk '($4 == "example@example.com") {print $0}' エラーのみ # cat mail.log | awk '($9 != 1) {print $0}'
■バウンスメールを解析
mailogの調査だけではなく、バウンスメールも解析するといい でも「バウンスは発生しないが、メールも届かない」はあり得るのでこれも絶対ではない Postfix+VERPでメールを識別できるようになる…はあるが、 maillogを解析して「どのアドレスに届かなかったか」が判れば大抵は十分かも 可能なら、maillogとバウンスメールの両方を調査できる状態にしておくことが好ましい 参考:バウンスメールとは何か? http://bouncehammer.jp/ja/what-is-bounced-email 参考:バウンスが発生する3つのタイミング http://bouncehammer.jp/ja/email-topics/when-does-email-bounce 参考:携帯電話宛バウンスの見分け http://bouncehammer.jp/ja/email-topics/distinguish-between-the-unknown-and-the-filtered 参考:携帯のドメイン指定フィルタが原因でバウンスしてしまいました。再送するにはどうすればよいですか? https://support.sendgrid.kke.co.jp/hc/ja/articles/206442433 参考:VERP でメール不達エラーの宛先アドレスを識別する https://fumiyas.github.io/2014/12/25/verp.postfix-advent-calendar.html 以下は相手に届かないけどバウンスメールも送られない…というケース 参考:携帯のドメイン指定フィルタが原因でバウンスしてしまいました。再送するにはどうすればよいですか? https://support.sendgrid.kke.co.jp/hc/ja/articles/206442433-%E6%90%BA%E5%B8%AF%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E6%8C%87%E5%AE%9A%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%8C%E5%8E%9F%E5%9B%A0%E3%81%A7%E3%83%90%E3%82%A6%E3%83%B3%E3%82%B9%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F-%E5%86%8D%E9%80%81%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B-
■cronを編集
# vi /etc/crontab 参考:/etc/crontabと/etc/cron.d設定ファイルの書き方 | server-memo.net http://www.server-memo.net/tips/etc-crontab.html 「crontab -e」でも設定できるが危険 参考:crontab -e は「絶対に」使ってはいけない http://d.hatena.ne.jp/ozuma/20120711/1342014448 ただしcrontabコマンドで編集すれば、書式に問題があれば教えてくれるというメリットはある viでファイルを直接編集する場合は、書式チェックはされないので注意 書式自体に問題がある場合、Cron自体が動かずにエラーメールも届かないみたい ユーザごとのcronは /var/spool/cron/ 内に実行ユーザ名のファイルに記録される 具体的には以下のようなファイルに記録される(Webminでcronを登録した場合も、ここに記録される) /var/spool/cron/apache /var/spool/cron/root 以下のディレクトリ内にもcron用のファイルを置くことができる /etc/cron.d ... 1分に1回実行される /etc/cron.daily ... 1日に1回実行される /etc/cron.hourly ... 1時間に1回実行される /etc/cron.monthly ... 1ヶ月に1回実行される /etc/cron.weekly ... 1週間に1回実行される /etc/anacrontab ... 1日に1回実行される。その時間に電源が入っていなかったなどがあっても遅延実行される 以下のファイルに、Cronの利用を許可する・禁止するユーザの名前を登録できる ファイルがなければ新規に作成する /etc/cron.allow /etc/cron.deny 参考:Linux、「/etc/cron.allow」「/etc/cron.deny」とはなんぞや?|マコトのおもちゃ箱 〜ぼへぼへ自営業者の技術メモ〜 http://piyopiyocs.blog115.fc2.com/blog-entry-703.html
■システムをリアルタイムに監視
Sysstatをインストールしておくと、sarコマンドでシステムの状況を表示できるようになる インストールするだけで、システムの状況が /etc/cron.d/sysstat によって /var/log/sa/ 内に記録されるようになる。 記録された情報は # sar -f /var/log/sa/sa05 で確認できる。(上の例は、ある月の5日の情報)また # sar [オプション] [秒] [カウント] とすれば現在の状況をリアルタイムに監視できる。 使用例は以下のとおり。 # sar -q 1 10 … システム全体の負荷 # sar -u 1 10 … CPUの使用状況 # sar -P ALL 1 10 … CPUの使用状況(コアごと) # sar -r 1 10 … メモリの使用状況 # sar -W 1 10 … スワップの確認 # sar -b 1 10 … I/Oの確認 # sar -d -p 1 10 … ブロックデバイスの確認 # sar -n DEV 1 10 … ネットワークデバイスの確認 # sar -n DEV 1 10 | grep eth0 … ネットワークデバイスの確認(eth0のみ) # sar -q -s 10:00:00 -e 12:30:00 -f /var/log/sa/sa05 … 時間を指定して確認
■コマンドの実行時間を表示
$ time sleep 3 real 0m3.001s user 0m0.000s sys 0m0.000s real ... プログラムの呼び出しから終了までにかかった実時間(秒) user ... プログラム自体の処理時間(秒)(ユーザCPU時間) sys ... プログラムを処理するために、OSが処理をした時間(秒)(システム時間) 以下は計測例。余計なcatを挟まない方が高速であることが判る ログ解析コマンドのチューニングなどに使える # time cat /var/log/httpd/access_log | grep -ie "\(\.ico\)" real 0m0.005s user 0m0.000s sys 0m0.000s # time grep -ie "\(\.ico\)" /var/log/httpd/access_log real 0m0.004s user 0m0.000s sys 0m0.000s
■CentOSのバージョンと何ビットマシンかを調べる
参考:CentOSのバージョンと?bitマシンかを調べる。 http://qiita.com/GENYA/items/9ffbd78cb7f82ecc5b7e # cat /etc/redhat-release … CentOSのバージョンを調べる CentOS release 6.7 (Final) # uname -m … 何ビットマシンかを調べる x86_64 # arch … 「uname -m」と同じ結果が表示される x86_64 「x86_64」「amd64」という文字があれば64ビット 「i386」「i686」「x86」という文字があればは32ビット 以下のようにすると、マシンに関するすべての情報が表示される # uname -a … 何ビットマシンかを調べる Linux refirio.net 2.6.32-573.1.1.el6.x86_64 #1 SMP Sat Jul 25 17:05:50 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
■各種バージョンを調べる
$ uname -r … カーネルのバージョンを調べる 2.6.32-573.1.1.el6.x86_64 $ php -v … PHPのバージョンを調べる PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies $ mysql -u root -p'1234' -D mysql -e "SELECT VERSION()" … MySQLのバージョンを調べる +-----------+ | VERSION() | +-----------+ | 5.1.73 | +-----------+
■CPUを調べる
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 63 model name : Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz stepping : 2 〜略〜 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management:
■サーバの日時を確認
$ date 2016年 1月 20日 水曜日 19:55:25 JST
■サーバの日時を設定
参考:dateコマンドでLinuxサーバの時刻変更 http://qiita.com/na0AaooQ/items/af6b853faf32c58c21d3 date -s "12/08 13:00 2016" … 任意の日時に変更 date … 日時の確認 AWSのEC2で上の設定を行い、S3を使おうとすると以下の例外が発生する S3Exception: The difference between the request time and the current time is too large. 参考:WindowsOS上のインターネット時刻同期無効化後、RDP切断、ヘルスチェックエラー https://forums.aws.amazon.com/thread.jspa?tstart=0&threadID=147084 AWSでは時刻の変更は非推奨みたい
■プロセスを確認&強制終了
■top $ top … システム全体の負荷を表示。プロセス、CPU、メモリ、スワップの統計情報も表示 top実行中に「1」を入力 … 「Cpu(s)」の項目で、CPUごとのデータを表示 top実行中に「C」を入力 … COMMAND列に、コマンドの詳細を表示 top実行中に「Shift+P」 … CPU使用率順にソート(デフォルト) top実行中に「Shift+M」 … メモリ使用率順にソート top実行中に「Shift+O」 … ソートできる項目が一覧表示されるので、ソートしたいアルファベットを入力してEnter topコマンドを終了したい場合、「Q」もしくは「Ctrl+C」を入力する 参考:topコマンドの使い方 - Qiita https://qiita.com/k0kubun/items/7368c323d90f24a00c2f ■ps $ ps aux … プロセスを確認 $ ps aux | grep プロセス名 … プロセス名で絞り込み $ ps aux --sort=-pcpu … CPUの降順にソート $ ps aux --sort=-pmem … メモリの降順にソート $ ps auxw --sort=-pcpu … wを付けるとCOMMANDを省略せずに表示 $ pstree … ツリー状に表示 $ pstree -c … サブツリーをまとめずに、ツリー状に表示 $ ps aux -L … スレッドを確認する PIDがプロセスID、LWPがスレッドID、NLWPがスレッド数 参考:逆引きUNIXコマンド/psコマンドでスレッドを確認する方法 http://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/ps%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95 ■プロセスの強制終了 $ kill -KILL プロセス番号 … プロセスを強制終了 $ kill -9 プロセス番号 … 「-KILL」と「-9」は同じ意味 参考:pgrep, pkill を使用してプロセスを殺す http://d.hatena.ne.jp/lurker/20061102/1162427170
■サービスを起動
UNIXではバックグラウンドプロセス(常駐プログラム)を「デーモン」と呼ぶ 「サービス」も同じ意味で使われる # service httpd start … Apacheを起動 ■起動方法が複数ある経緯 直接起動する場合 # /usr/sbin/apachectl start 他のサービスと同じような手順で扱えるようにするため、起動スクリプトが用意された。内部では /usr/sbin/apachectl を呼んでいる # /etc/rc.d/init.d/httpd start /etc/rc.d/init.d/ から /etc/init.d/ にシンボリックリンクが張られているので、以下のコマンドでも可能 # /etc/init.d/httpd start さらに環境変数の影響を受けにくいようにした。内部では /etc/init.d/httpd を呼んでいる # service httpd start CentOS7からは、systemctlコマンドで行うようになった。serviceでも可能だが、systemctlコマンドにリダイレクトされる # systemctl start httpd.service 参考:apacheの起動について https://okwave.jp/qa/q1237460.html 参考:apachectlコマンドとhttpdの違い http://www.wegirls.tech/entry/2016/09/29/075200 参考:デーモンの起動・終了にはserviceコマンドを利用しよう http://heartbeats.jp/hbblog/2013/06/service-start-stop.html 参考:起動スクリプト(httpd)を読んでみた - まどろみの思考空間 http://hogespace.hatenablog.jp/entry/2013/06/13/222637 ■設定を再読込 設定ファイルを編集して反映させたいだけなら、以下で十分かも。 restartでなければ反映されない項目もあるかも。要検証 $ service httpd reload
■MySQLでプロセスを確認&強制終了
参考:MYSQL障害解析の被疑箇所別 勘所 まとめ http://www.hachim.jp/study-by-incident/mysql-unyo-viewpoint-2.html 参考:MySQL プロセスを強制終了する http://mysql.javarou.com/dat/000580.html 参考:MySQLで処理に長時間かかっている複数クエリをまとめて殺す方法 http://tech.basicinc.jp/MySQL/2014/04/06/mysql_processlist_kill/ MySQLはシングルプロセスでマルチスレッドなので、topやpsでは1プロセスしか確認できない $ top 3008 mysql 20 0 16.7g 7.4g 4748 S 16.9 47.0 1710:57 mysqld 1081 apache 20 0 452m 32m 7780 S 2.3 0.2 0:12.92 httpd 6524 apache 20 0 450m 30m 7744 S 1.0 0.2 0:11.13 httpd 14172 apache 20 0 448m 28m 7784 S 1.0 0.2 0:12.11 httpd 1352 root 20 0 0 0 0 S 0.3 0.0 21:55.68 kondemand/4 1516 root 39 19 0 0 0 S 0.3 0.0 301:43.94 kipmi0 $ ps aux --sort=-pcpu USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 3008 1.5 46.9 17528172 7719056 ? Sl 2015 1711:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf - root 1724 0.2 0.3 797704 54604 ? Ssl 2015 582:05 /usr/sbin/eecd bwave 17628 0.2 0.0 15300 1572 pts/0 S+ 10:17 0:32 top apache 373 0.1 0.1 442372 22744 ? S 11:14 0:09 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd. apache 820 0.1 0.1 461384 32292 ? S 10:05 0:15 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd. apache 1081 0.1 0.2 463188 33328 ? S 10:05 0:12 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd. スレッドの確認は、以下のようにmysqlコマンド内で SHOW PROCESSLIST を使う KILL でスレッドの強制終了ができる mysql> SHOW PROCESSLIST; +----+------+----------------+--------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+----------------+--------+---------+------+-------+------------------+ | 9 | root | localhost:4049 | testdb | Sleep | 39 | | NULL | | 13 | root | localhost:4451 | test | Query | 0 | NULL | SHOW PROCESSLIST | +----+------+----------------+--------+---------+------+-------+------------------+ 2 rows in set (0.00 sec) mysql> KILL 9; Query OK, 0 rows affected (0.00 sec) mysql> SHOW PROCESSLIST; +----+------+----------------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+----------------+------+---------+------+-------+------------------+ | 13 | root | localhost:4451 | test | Query | 0 | NULL | SHOW PROCESSLIST | +----+------+----------------+------+---------+------+-------+------------------+ 1 row in set (0.00 sec) ■RDS ※未検証 RDSでは「KILL 9;」ではエラーになり、「CALL mysql.rds_kill(9);」のようにする必要があるみたい 参考:Amazon RDS な MySQL で 不要 process を kill する - Garbage in, gospel out http://libitte.hatenablog.jp/entry/20141202/1417452564 参考:RDS上のMySQLでKILLは使えない | // sakura note https://saku.io/cant-use-kill-on-rds-mysql/
■MySQLで文字コードを確認
mysql> SHOW VARIABLES LIKE '%char%'; … MySQLの文字コードを確認 mysql> SHOW CREATE DATABASE `test`; … 特定データベースの文字コードを確認 mysql> SHOW CREATE TABLE `address`; … 特定テーブルの文字コードを確認
■MySQLでスロークエリを確認
スロークエリの設定を確認 mysql> show variables like 'slow%'; mysql> show variables like 'long%'; スロークエリの設定を変更 mysql> set global slow_query_log_file = '/tmp/mysql-slow.log'; mysql> set global long_query_time = 5; mysql> set global slow_query_log = ON; スロークエリを表示(ファイルに記録している場合) $ vi /var/run/mysqld/mysqld-slow.log スロークエリを表示(テーブルに記録している場合。MySQL5.1以降では「log_output = TABLE」とすればテーブルに記録できる) mysql> SELECT * FROM mysql.slow_log; スロークエリを解析(実行時間の遅い順に表示) $ mysqldumpslow -s t /var/run/mysqld/mysqld-slow.log スロークエリを解析(実行回数の多いものを探す / 解析後、設定を元に戻す) mysql > set global slow_query_log_file = '/tmp/slow.log'; mysql > set global long_query_time = 0; $ mysqldumpslow -s c /tmp/slow.log 参考:Mysql slow queryの設定と解析方法 http://d.hatena.ne.jp/masayuki14/20120704/1341360260
■MySQLで実行中のクエリを確認
実行中のクエリを確認 mysql> SHOW PROCESSLIST\G 1000文字を超えるSQLも表示 mysql> SHOW FULL PROCESSLIST\G 参考:MySQLをチューニング,そしてスケールアップ/スケールアウトへ http://gihyo.jp/dev/serial/01/MySQL-tuning-scale/0005?page=2
■MySQLで現在のコネクション数を確認
$ /usr/bin/mysql -s -N -u [USER] -p[PASSWD] -e "SHOW STATUS LIKE 'Threads_connected';" | cut -f2
■MySQLのデータ容量を確認
参考:MySQLでDBとテーブルのサイズを確認するSQL http://qiita.com/iKenji/items/b868877492fee60d85ce ■DBのサイズ SELECT table_schema AS DB, SUM(data_length) / 1024 / 1024 AS MB FROM information_schema.tables GROUP BY table_schema ORDER BY SUM(data_length + index_length) DESC; +------------------------+-------------+ | DB | MB | +------------------------+-------------+ | test | 40.50000000 | | company | 29.70312500 | | abc | 13.28125000 | +------------------------+-------------+ ■テーブルのサイズ SELECT table_name, engine, table_rows AS tbl_rows, FLOOR((data_length + index_length) / 1024) AS allKB, #総容量 FLOOR((data_length) / 1024) AS dataKB, #データ容量 FLOOR((index_length) / 1024) AS indexKB #インデックス容量 FROM information_schema.tables WHERE table_schema = database() ORDER BY (data_length + index_length) DESC; +------------+--------+----------+-------+--------+---------+ | table_name | engine | tbl_rows | allKB | dataKB | indexKB | +------------+--------+----------+-------+--------+---------+ | rooms | InnoDB | 1829 | 1552 | 1552 | 0 | | buildings | InnoDB | 554 | 160 | 160 | 0 | | users | InnoDB | 2 | 96 | 16 | 80 | +------------+--------+----------+-------+--------+---------+
■MySQLのインデックスを確認
mysql> SHOW INDEX FROM tablename;
■MySQLでユーザを削除
mysql> DELETE FROM mysql.user WHERE user = 'username'; … 「username」を削除 mysql> FLUSH PRIVILEGES; … 設定を反映
■MySQLでデータベースエンジン(InnoDBかMyISAM)を確認
mysql> USE information_schema; mysql> SELECT table_name, engine FROM TABLES WHERE table_schema = 'tablename';
■MySQLでMyISAMをInnoDBに変更
参考:MyISAMとInnoDBのどちらを使うべきか http://opendatabaselife.blogspot.jp/2009/10/myisaminnodb.html 参考:MySQLでMyISAMからInnoDBに乗り換える際に知らないとハマる、怖い話 http://y-ken.hatenablog.com/entry/mysql-migration-from-mysiam-to-innodb-tips mysql> ALTER TABLE tablename ENGINE=InnoDB; mysql> SELECT COUNT(*) FROM tablename WHERE text LIKE '%テスト%'; +----------+ | COUNT(*) | +----------+ | 558622 | +----------+ 1 row in set (5.08 sec) InnoDBにすると、集計が1秒ほど遅くなった
■MySQLのバックアップ(エクスポートとインポート)
■エクスポート $ mysqldump -u ユーザー名 データベース名 > ダンプファイル名 $ mysqldump -u webmaster -p test > /var/www/backups/mysql_test_20140130.sql $ mysqldump -u webmaster -p test --default-character-set=binary > /var/www/backups/mysql_test_20140130.sql ■インポート $ mysql -u root データベース名 < ダンプファイル名 $ mysql -u webmaster -p test < mysql_test_20140130.sql $ mysql -u webmaster -p test --default-character-set=binary < mysql_test_20140130.sql ■WindowsのXAMPP環境での実行例 C:\xampp\mysql\bin\mysql -u root -p test < mysql_test_20140130.sql C:\xampp\mysql\bin\mysql -u root -p test --default-character-set=binary < mysql_test_20140130.sql ■文字化け対策 文字化けする場合は「--default-character-set=binary」を指定して試す 参考:mysqldumpで文字化けデータを頑張ってダンプ&リストア http://koexuka.blogspot.jp/2009/04/mysqldumpdump.html ■SOURCEコマンド MySQLにログイン後、SOURCEコマンドを実行してインポートすることもできる mysql> SOURCE mysql_test_20140130.sql 参考:ファイル読込|データのインポート・エクスポート|MySQL|PHP & JavaScript Room http://phpjavascriptroom.com/?t=mysql&p=mysqlimport ■LOADコマンド LOADコマンドでの登録が一番高速らしい CSVを作成する際に、バリデーションなどは行っておく必要はある /tmp/eccube.csv 1,'アイスクリーム',NULL,1,中略,NULL,0,2,'2016-09-13 09:22:23','2016-09-13 09:22:23',2 LOAD DATA INFILE "/tmp/eccube.csv" INTO TABLE dtb_products FIELDS TERMINATED BY "," LINES TERMINATED BY "\n"; 参考:MySQLに大量のデータを入れるときに最適な方法は? http://naoberry.com/tech/mysqldata/ ■MySQLを定期バックアップ 参考:MySQLデータベース自動バックアップ運用(mysqldump) http://centossrv.com/mysql-backup.shtml
■PostgreSQLでユーザを確認
$ psql -c "SELECT * FROM pg_shadow;"
■メールのキューを確認
# mailq … メールキューを確認 # mailq | grep 'Request.' … メールキューの合計サイズと件数を確認 -- 1 Kbytes in 1 Request. # mailq | grep 'Request.' | awk '{print $5}' … メールキューの件数を確認 1 参考:Linux(CentOS 6) - メールキューの確認方法と削除方法 http://nobuneko.com/blog/archives/2013/05/linux_centos_6_mailq_postsuper.html
■ユーザ情報を確認
# vi /etc/passwd … ユーザ一覧を表示(誰でも表示可能) # vi /etc/shadow … ユーザのパスワードを表示(rootのみ表示可能 / パスーワードはハッシュ化されている) $ w … ログインユーザを確認 18:49:52 up 146 days, 5:08, 3 users, load average: 0.44, 0.30, 0.12 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT webmaste pts/0 p7cdba6cd.osakff Mon02 40:05m 0.00s 0.00s -bash ec2-user pts/1 p7cdba6cd.osakff 18:48 0.00s 0.00s 0.00s w ec2-user pts/2 p7cdba6cd.osakff 11May17 6days 0.10s 0.10s -bash ※ログインしているユーザの名前、それらのユーザが何をしているか、およびコンピュータにかかっている負荷を要約して表示する $ last -5 … ログイン履歴を確認(最近の5件) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 19:44 still logged in ec2-user pts/1 p7cdba6cd.osakff Tue May 30 18:48 - 19:42 (00:53) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 18:48 - 18:48 (00:00) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 18:47 - 18:47 (00:00) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 11:19 - 11:36 (00:17) wtmp begins Fri Oct 30 16:59:37 2015 $ last -5 webmaster … 特定ユーザのログイン履歴を確認 webmaste pts/0 p7cdba6cd.osakff Mon May 29 02:44 still logged in webmaste pts/3 p7cdba6cd.osakff Wed May 24 17:24 - 20:07 (02:43) webmaste pts/1 p7cdba6cd.osakff Wed May 24 17:23 - 17:28 (00:05) webmaste pts/1 p7cdba6cd.osakff Wed May 24 17:20 - 17:21 (00:00) webmaste pts/0 p7cdba6cd.osakff Wed May 24 15:59 - 16:29 (00:29)
■ツールがインストールされているか確認
# rpm -q httpd httpd-2.2.15-45.el6.centos.x86_64
■古いツールを削除
# rpm -q postgresql postgresql-8.4.20-1.el6_5.x86_64 # yum remove postgresql … 古いpostgresqlを削除
■コマンドを一定時間ごとに実行させる
$ watch ls -l /var/www/html/ … 2秒ごとにコマンドを実行(ファイルの監視。2秒はデフォルトの間隔) 参考:watchコマンドで覚えておきたい使い方6個 http://orebibou.com/2015/07/watch%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B96%E5%80%8B/
■サービスの自動起動を確認する
# chkconfig --list … 自動起動を確認する # chkconfig --list サービス名 … サービスの自動起動を確認する # chkconfig --add サービス名 … サービス設定の追加 # chkconfig --del サービス名 … サービス設定の追加 # chkconfig サービス名 on … サービスの自動起動を有効化 # chkconfig サービス名 off … サービスの自動起動を有効化 # chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off ランレベルの2〜5がonになっていれば自動起動が有効 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ランレベル 状態 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 システムの停止 1 シングルユーザモード 2 マルチユーザモード 3 マルチユーザモード(コンソールログイン) 4 未使用 5 マルチユーザモード(ディスプレイマネージャ使用) 6 システム再起動 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
■サーバをシャットダウン・再起動する
# shutdown -h now … すぐにシャットダウンする # shutdown -r now … すぐに再起動する # shutdown -h 0:0 … 0時にシャットダウンする # shutdown -r 10:30 … 10時半に再起動する