■目次
由来ファイル・ディレクトリ操作ファイルのハッシュを確認コマンド入力コマンド履歴アプリケーションがインストールされているか確認アプリケーションの検索アプリケーションを追加アプリケーションを削除アプリケーションの詳細情報を確認ログを確認ログをコピーApacheのログをコマンドで解析メールのログをコマンドで解析メールのログをmaillogconvert.plで変換してコマンドで解析バウンスメールを解析システムをリアルタイムに監視コマンドの実行時間を表示CentOSのバージョンと何ビットマシンかを調べる各種バージョンを調べるCPUを調べるサーバの日時を確認サーバの日時を設定プロセスを確認&強制終了サービスを起動MySQLでプロセスを確認&強制終了MySQLで文字コードを確認MySQLでスロークエリログを記録MySQLで実行中のクエリを確認MySQLで現在のコネクション数を確認MySQLのデータ容量を確認MySQLのインデックスを確認MySQLでユーザを削除MySQLでデータベースエンジン(InnoDBかMyISAM)を確認MySQLでMyISAMをInnoDBに変更MySQLのバックアップ(エクスポートとインポート)PostgreSQLでユーザを確認メールのキューを確認ユーザ情報を確認グループ情報を確認コマンドを一定時間ごとに実行させるサービスの自動起動を確認するサーバをシャットダウン・再起動する
■由来
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 ■ファイルの表示 $ vim test.txt … Vimを起動 $ vi test.txt … 大抵の環境ではVimが立ち上がる $ view test.txt … Vimの読み取り専用モードで表示(Vimの行番号やカラースキーマが適用される) $ cat test.txt … 内容をすべて表示 $ more test.txt … スペースキーで1ページずつ表示 $ less test.txt … ↑↓で1行ずつ表示。スペースキーで1ページずつ表示 Linuxでテキストファイルを閲覧できるコマンドにはいろいろあるよ - 無理しない感じ http://hogesuke.hateblo.jp/entry/2014/04/08/041951 コマンド 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 ./ -type f -print | xargs grep 'ABC' … 文字列「ABC」が含まれるファイルを表示 findコマンドの使い方: UNIX/Linuxの部屋 http://x68000.q-e-d.net/~68user/unix/pickup?find 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 検索対象のディレクトリを複数指定したり、ワイルドカードで指定したりもできる 以下は7月10日のログディレクトリから「太郎」という文字を含むファイルを探す例 # find 20180710/ -type f -print | xargs grep '太郎' 以下のようにすると、20180710〜20180713を対象にできる(個別に指定する例) # find 20180710/ 20180711/ 20180712/ 20180713/ -type f -print | xargs grep '太郎' 以下のようにすると、20180710〜20180719を対象にできる(ワイルドカードで指定する例) # find 2018071*/ -type f -print | xargs grep '太郎' 以下のようにすると、ファイルの更新日時をもとに検索できる $ 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 ... 一週間前に更新された ■ディスク使用量を確認 # 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 をつけると、ファイルサイズを適当な単位で表示してくれる # du -sh /* | sort -nr # ll -h /var/www/html ■ディレクトリ構成を tree 風に表示する $ pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g' tree コマンドが無い環境で tree コマンドを実現 - Qiita https://qiita.com/yone098@github/items/bba8a42de6b06e40983b ディレクトリ構成を tree 形式に表示する - Qiita https://qiita.com/hide/items/9a2876486b975e77b9c0 ■所有者と権限を変更 # chown apache /var/www/html/test … ディレクトリの所有者をapacheに変更 # chown -hR apache /var/www/html/test … ディレクトリの所有者をapacheに変更(再帰的) # chgrp apache /var/www/html/test … ディレクトリのグループをapacheに変更 # chgrp -hR apache /var/www/html/test … ディレクトリのグループをapacheに変更(再帰的) # chown apache. /var/www/html/test … ディレクトリの所有者とグループをapacheに変更 # chown apache:apache /var/www/html/test … 上と同じ # chown -hR apache. /var/www/html/test … ディレクトリの所有者とグループをapacheに変更(再帰的) # chown -hR apache:apache /var/www/html/test … 上と同じ # 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に変更(再帰的) Linuxコマンド【 chown 】ファイルの所有者やグループを変更 - Linux入門 - Webkaru https://webkaru.net/linux/chown-command/ find + chmodでパーミッションの一括変更 http://ext.omo3.com/webmaster/chmod.html ■ファイル作成時の所属グループを、親ディレクトリのグループにする # chmod g+s /var/www/html/test ファイル作成時の所属グループを、ディレクトリのグループに設定する http://qiita.com/ritukiii/items/bbb34c372ce35ec55679 ■ディレクトリを作成 $ mkdir test … ディレクトリを作成 $ mkdir -p test/abc … 複数階層のディレクトリを作成 $ 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 test/* /test_backup/ ... 隠しファイルや隠しフォルダはコピー対象にならない $ cp -rp test/. /test_backup/ ... 隠しファイルや隠しフォルダもコピー対象になる 使用例: $ cp -rp /var/www/vhosts/xxx/html/phpmyadmin /var/www/vhosts/yyy/html cpコマンドで不可視ファイルまでコピーする - Qiita https://qiita.com/sayama0402/items/cdf7debc9784ebac0115 ■ディレクトリを複製(特定ディレクトリを除外) 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 compress.zip file1 file2 … ZIP形式で圧縮 $ zip -r compress.zip directory … 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 ■ファイルを比較 $ diff config.default.php config.php … ファイルを比較 $ diff -u config.default.php config.php … git風にファイルを比較 $ diff -ybBw config.default.php config.php … WinMerge風にファイルを比較 diffコマンドを便利に使う | bacchi.me https://bacchi.me/linux/diff-tips/
■ファイルのハッシュを確認
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/
■アプリケーションがインストールされているか確認
# rpm -q httpd httpd-2.4.6-67.el7.centos.6.x86_64
■アプリケーションの検索
# yum search httpd
■アプリケーションを追加
# yum install httpd # yum -y install httpd … 確認せずにインストール
■アプリケーションを削除
# rpm -q postgresql postgresql-8.4.20-1.el6_5.x86_64 # yum remove postgresql … 古いpostgresqlを削除。「remove」は「erase」としても同じ
■アプリケーションの詳細情報を確認
# yum info httpd 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: www.ftp.ne.jp * epel: ftp.kddilabs.jp * extras: www.ftp.ne.jp * remi-safe: mirrors.mediatemple.net * updates: www.ftp.ne.jp * webtatic: sp.repo.webtatic.com インストール済みパッケージ 名前 : httpd アーキテクチャー : x86_64 バージョン : 2.4.6 リリース : 67.el7.centos.6 容量 : 9.4 M リポジトリー : installed 提供元リポジトリー : updates 要約 : Apache HTTP Server URL : http://httpd.apache.org/ ライセンス : ASL 2.0 説明 : The Apache HTTP Server is a powerful, efficient, and extensible : web server.
■ログを確認
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 認証に関するログ(suやsudoの実行履歴など。rootの操作内容が残るわけではないので、一部の管理者以外にはsudo経由で実行させることが好ましい) # cat /var/log/secure cronに関するログ # cat /var/log/cron メールに関するログ # cat /var/log/maillog yumによるパッケージ情報操作に関するログ # cat /var/log/yum.log システム起動時に画面に表示されていた内容 # cat /var/log/boot.log ログインに成功したログ(バイナリファイル。内容はlastコマンドで確認する) # /var/log/wtmp ログインに失敗したログ(バイナリファイル。内容はlastbコマンドで確認する) # /var/log/btmp 各ユーザーの最後にログインした日時のログ(バイナリファイル。内容はlastlogコマンドで確認する) # /var/log/lastlog ログインに成功したログを整形して表示 # last -n 10 refirio ログインに成功したログを整形して表示(ホストを省略せずに最後に表示) # last -n 100 refirio -a ログインに失敗したログを整形して表示 # last -n 10 refirio 各ユーザーの最後にログインした日時のログを整形して表示 # lastlog 【last, lastlog】Linuxでログイン履歴を確認するコマンド | UX MILK https://uxmilk.jp/26163 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... ■Apache アクセスログ # cat /var/log/httpd/access_log アクセスログ(SSLの場合) # cat /var/log/httpd/ssl_access_log エラーログ # cat /var/log/httpd/error_log エラーログ(SSLの場合) # cat /var/log/httpd/ssl_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)' 圧縮されたログを検索 # zgrep XXX /var/log/httpd/access_log gzのファイルを展開せずにgrepする - Qiita https://qiita.com/aaaaAAAA1111/items/7b56b2f5c3073f8f6b19 ■ファイルの監視 # 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を使う方が高速。計測方法は「コマンドの実行時間を表示」を参照 ※SSL経由のアクセスの場合、ログは /var/log/httpd/ssl_access_log に記録されるので注意 ※コマンド以外だと、例えば以下のようなソフトがある ApacheLogViewerソフトでログからアクセス解析 [DokuWikiで情報発信] https://dokuwiki.oreda.net/access/apachelogviewer.html ■各項目の参照(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マイクロ秒 レスポンスタイムを参照 # cat /var/log/httpd/access_log | awk '{print $NF}' 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}' ■5分以内のApacheログを表示 ※月をまたぐと、余計なデータが表示されてしまう あらかじめ日でgrepしておくか。高速化にもなるかも。要検証 grep '01/Jun/2018' /var/log/nginx/access.log | awk -F'\\[|\\]' '"01/Jun/2018:01:00:00" < $2' date … 現在の日時を表示 date "+%Y-%m-%d %H:%M:%S" … フォーマットして表示(「+」に続けてフォーマットを指定) LC_ALL=C date "+%d/%b/%Y:%H:%M:%S" … 日本語環境でも英語表記で表示 LC_ALL=C date -d '5 minutes ago' "+%d/%b/%Y:%H:%M:%S" … 5分前の日時を英語表記で表示 tail -n 10 /var/log/httpd/access_log | awk -F'\\[|\\]' '{ print $2 }' … Apacheログの日時を取得 tail -n 10 /var/log/nginx/access.log | awk -F'\\[|\\]' '{ print $2 }' … nginxログの日時を取得 awk -F'\\[|\\]' '"31/May/2018:19:30:00" < $2' /var/log/httpd/access_log … 特定日時以降のApacheログを表示 awk -F'\\[|\\]' '"31/May/2018:19:30:00" < $2' /var/log/nginx/access.log … 特定日時以降のnginxログを表示 vi get_access_log.sh … 5分以内のログを表示
#!/bin/bash # 5分前の日時を取得 datetime=`LC_ALL=C date -d '5 minutes ago' "+%d/%b/%Y:%H:%M:%S"` # 5分以内のApacheログを表示 awk -F'\\[|\\]' '"'"${datetime}"'" < $2' /var/log/httpd/access_log # 5分以内のnginxログを表示 #awk -F'\\[|\\]' '"'"${datetime}"'" < $2' /var/log/nginx/access.log
■メモ あなたはだんだん、ファイルを読むのにlessコマンドを使いたくなる http://qiita.com/marrontan619/items/95e954972706f32be255 Apache ログを awk と uniq だけで集計する https://qiita.com/bezeklik/items/f5c292c4360cde140bef アクセスログからピーク時の分間hit数を割り出す https://hacknote.jp/archives/11938/ 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 date コマンド | コマンドの使い方(Linux) | hydroculのメモ https://hydrocul.github.io/wiki/commands/date.html "date" 日付・時刻の表示 @LCD -Linux Command Dictionary-|Replog!株式会社レップワンスタッフによるブログです http://www.rep1.co.jp/staff/200vcxg/217rav/date_lcd_-linux_command_dictio_2.htm 特別なコマンド無しで「◯◯時からXX時までの間のログを抽出」というように、時間指定でログを抽出させる方法(awk,sed) https://orebibou.com/2015/04/%E7%89%B9%E5%88%A5%E3%81%AA%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E7%84%A... awkへシェルスクリプトの変数を渡す - Qiita https://qiita.com/yamao2253/items/cf69b68447214036e914 俺の愛用ワンライナー、Web企業のエンジニア16人に聞きました - エンジニアHub|若手Webエンジニアのキャリアを考える! https://employment.en-japan.com/engineerhub/entry/2018/05/08/110000 ■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@refirio.net") {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%...
■システムをリアルタイムに監視
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 … 時間を指定して確認 sarコマンドでLinuxサーバのシステムモニタリングを行う方法 http://naoberry.com/tech/sar/
■コマンドの実行時間を表示
$ 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、メモリ、スワップの統計情報も表示 「%CPU」と「%MEM」で、CPUとメモリの使用率が判る。ただし数値が大きくても、すぐに終わる処理なら問題はない CPUの使用時間は「TIME+」で判る 時間は「分、秒、1/10秒」もしくは「時、分、秒」で表示される。しばらく眺めてどちらの表示なのか判断する 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 topコマンドで覚えておきたい使い方14個 | 俺的備忘録 〜なんかいろいろ〜 https://orebibou.com/2015/07/top%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%8... ■ps $ ps aux … プロセスを確認。topとは違い、リアルタイムではない $ 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... 「ps aux」のようにオプションにハイフンを付けないものは、「BSDオプション」と呼ばれる記法 「ps -ef」のようにオプションにハイフンを付けるものは、「UNIX」オプションと呼ばれる記法 Linuxではどちらの記法も指定可能で、混在させることもできる ps のオプションについてのメモ書き - 双六工場日誌 http://sechiro.hatenablog.com/entry/20120805/1344139544 ps - CodeZine(コードジン) https://codezine.jp/unixdic/w/ps psでCPU使用率をはからないように - ikeasの日記 http://d.hatena.ne.jp/ikeas/20091130/1259595249 topとはCPU使用率の計算方法が異なるようなので注意 ■プロセスの強制終了 $ kill -KILL プロセス番号 … プロセスを強制終了 $ kill -9 プロセス番号 … 「-KILL」と「-9」は同じ意味 pgrep, pkill を使用してプロセスを殺す http://d.hatena.ne.jp/lurker/20061102/1162427170
■サービスを起動
UNIXではバックグラウンドプロセス(常駐プログラム)を「デーモン」と呼ぶ daemonはギリシャ語由来の言葉で「精霊」「守護者」の意味。善でも悪でもない、目には見えない霊的存在を指す 転じて、バックグラウンドで動作して様々な雑務をこなしてくれるプロセスをデーモンと呼ぶようになった 「サービス」も同じ意味で使われる # service httpd start … Apacheを起動 ■起動方法が複数ある経緯 直接起動する場合 # /usr/sbin/apachectl start 他のサービスと同じような手順で扱えるようにするため、起動スクリプトが用意された 内部では /usr/sbin/apachectl を呼んでいる(/etc/rc.d/init.d/httpd をviなどで開けば、内容を確認できる) # /etc/rc.d/init.d/httpd start /etc/rc.d/init.d/ から /etc/init.d/ にシンボリックリンクが張られているので、以下のコマンドでも可能 # /etc/init.d/httpd start さらに環境変数の影響を受けにくいようにした 内部では /etc/init.d/httpd を呼んでいる(/sbin/service をviなどで開けば、内容を確認できる) # 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) mysql> SHOW PROCESSLIST; の代わりに mysql> SELECT * FROM information_schema.PROCESSLIST; として一覧することもできる。この場合、 mysql> SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60; このようにすれば、60秒より長く実行され続けているクエリを探すこともできる 上記の方法だと長いSQLが省略表示されてしまうが、 以下のように「\G」をつけると全文を確認できる mysql> SHOW FULL PROCESSLIST \G; *************************** 1. row *************************** Id: 164233 User: webmaster Host: 10.0.0.225:54468 db: NULL Command: Query Time: 0 State: starting Info: SHOW FULL PROCESSLIST *************************** 2. row *************************** Id: 164473 User: webmaster Host: 10.0.0.225:54812 db: test Command: Execute Time: 0 State: Sending data Info: select * from `test` where `status` is null *************************** 3. row *************************** Id: 164703 User: webmaster Host: 10.0.0.119:51828 db: test Command: Sleep Time: 198 State: Info: NULL *************************** 4. row *************************** 〜略〜 *************************** 10. row *************************** Id: 164778 User: webmaster Host: 10.0.0.119:51892 db: test Command: Execute Time: 0 State: Sending data Info: select * from `test` where `status` is null 10 rows in set (0.00 sec) ERROR: No query specified 実行中のプロセスの一覧を表示する - MySQL 逆引きリファレンス http://mysql.javarou.com/dat/000582.html ■RDS ※未検証 RDSでは「KILL 9;」ではエラーになり、「CALL mysql.rds_kill(9);」のようにする必要があるみたい …だが、普通に「KILL 9;」でもKILLできるような… 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 slow queryの設定と解析方法 - 主夫ときどきプログラマ http://masayuki14.hatenablog.com/entry/20120704/1341360260 mysql> SELECT * FROM mysql.slow_log; … スロークエリを確認 Empty set (0.30 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'slow_query_log'; … スロークエリのON/OFFを確認(初期設定はOFF) +----------------+-------+ | Variable_name | Value | +----------------+-------+ | slow_query_log | OFF | +----------------+-------+ 1 row in set (0.25 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time'; … スロークエリの記録時間を確認(初期設定は10秒) +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'log_output'; … スロークエリの記録先を確認(初期設定はファイル) +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ 1 row in set (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'slow_query_log_file'; … スロークエリの記録ファイルを確認(初期設定は /var/lib/mysql/refirio-slow.log) +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_query_log_file | /var/lib/mysql/refirio-slow.log | +---------------------+---------------------------------+ 1 row in set (0.01 sec) mysql> SET GLOBAL slow_query_log = ON; … スロークエリのON/OFFを変更 mysql> SET GLOBAL long_query_time = 1.0; … スロークエリの記録時間を変更 mysql> SET GLOBAL log_output = 'TABLE'; … スロークエリの記録先をデータベースに変更 mysql> SELECT * FROM mysql.slow_log; … スロークエリを確認 mysql> SELECT * FROM mysql.general_log; … 一般ログを確認 mysql> SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10; … スロークエリを時間の長い順に表示する例 ■ファイルに記録したスロークエリを解析する例 スロークエリの出力ファイルを変更する場合 mysql> set global slow_query_log_file = '/tmp/mysql-slow.log'; スロークエリを表示 $ vi /var/run/mysqld/mysqld-slow.log スロークエリを解析(実行時間の遅い順に表示) $ mysqldumpslow -s t /var/run/mysqld/mysqld-slow.log
■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 「--default-character-set」に「binary」を指定しても文字化けする場合、「utf8」や「latin1」も試す ■インポート $ 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\mysqldump -u root -p test --default-character-set=binary > mysql_test_20140130.sql C:\xampp\mysql\bin\mysql -u root -p test --default-character-set=binary < mysql_test_20140130.sql ■PHPからの実行例
<?php echo shell_exec('mysqldump -u webmaster -p"1234" test --default-character-set=binary > mysql_test_20140130.sql'); exit('Complete');
PHPで独自にSQLエクスポートの仕組みを作るより、圧倒的に高速 データが巨大すぎて独自システムからエクスポートできなかったものも、難なくエクスポートできた 同様に、以下のようにしてインポートもできた
<?php echo shell_exec('mysql -u webmaster -p"1234" twitter_test --default-character-set=binary < mysql_test_20140130.sql'); exit('Complete');
■文字化け対策 文字化けする場合は「--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)
■グループ情報を確認
# vi /etc/group … グループ一覧を表示(誰でも表示可能) # vi /etc/gshadow … グループのパスワードを表示(rootのみ表示可能 / パスーワードはハッシュ化されている)
■コマンドを一定時間ごとに実行させる
$ 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%...
■サービスの自動起動を確認する
# 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時半に再起動する # halt … マシンを停止する # reboot … マシンを再起動する # poweroff … マシンの電源を切る