Linuxサーバでディスク使用率が100%
WordpressをのっけてるだけのAWSインスタンスでディスク使用率が100%になってるけどどこが原因かわからない、と相談を受けた。
df
で見てみると、
$ df -h Filesystem Size Used Avail Use% Mounted on udev 492M 12K 492M 1% /dev tmpfs 100M 348K 99M 1% /run /dev/xvda1 9.8G 9.3G 0 100% / none 4.0K 0 4.0K 0% /sys/fs/cgroup none 5.0M 0 5.0M 0% /run/lock none 497M 0 497M 0% /run/shm none 100M 0 100M 0% /run/user
たしかに100%になってる。どこがそんなに使ってるのかdu
で見てみると
$ sudo du -sh /* | sort -nr ... 16K /lost+found 12K /tmp 12K /dev 9.6M /bin 9.4M /sbin 8.0K /srv 5.8M /etc 4.0K /media 4.0K /lib64 1.2G /opt 0 /vmlinuz.old 0 /vmlinuz ...
最も多く使ってる/optでも1.2G、合計してもどう見ても10G使ってない。ふむ?とlsof
してみると
$ sudo lsof +L1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME .php-fpm. 2996 root 3u REG 202,1 0 0 768 /tmp/.ZendSem.pdfqGY (deleted) httpd.bin 6902 daemon 2w REG 202,1 6619189248 0 420123 /opt/bitnami/apache2/logs/error_log (deleted) .php-fpm. 8401 daemon 3u REG 202,1 0 0 768 /tmp/.ZendSem.pdfqGY (deleted) .php-fpm. 8402 daemon 3u REG 202,1 0 0 768 /tmp/.ZendSem.pdfqGY (deleted) httpd.bin 9046 daemon 2w REG 202,1 6619189248 0 420123 /opt/bitnami/apache2/logs/error_log (deleted) mysqld.bi 10949 mysql 6u REG 202,1 0 0 419686 /opt/bitnami/mysql/tmp/ib7SYs7U (deleted) mysqld.bi 10949 mysql 7u REG 202,1 0 0 419693 /opt/bitnami/mysql/tmp/ibi20k04 (deleted) mysqld.bi 10949 mysql 8u REG 202,1 0 0 419694 /opt/bitnami/mysql/tmp/ib0FadTe (deleted) mysqld.bi 10949 mysql 9u REG 202,1 0 0 419968 /opt/bitnami/mysql/tmp/ibb9soFy (deleted) mysqld.bi 10949 mysql 13u REG 202,1 0 0 419969 /opt/bitnami/mysql/tmp/ibyLvBPI (deleted) .php-fpm. 11246 daemon 3u REG 202,1 0 0 768 /tmp/.ZendSem.pdfqGY (deleted) httpd.bin 12328 daemon 2w REG 202,1 6619189248 0 420123 /opt/bitnami/apache2/logs/error_log (deleted) httpd.bin 28733 root 2w REG 202,1 6619189248 0 420123 /opt/bitnami/apache2/logs/error_log (deleted)
削除済の巨大なerror_logにhttpdがアクセスしててこれが原因っぽい。Apache再起動してもOKとのことだったのでbitnamiのお作法に従い“ctlscript.sh”を使って再起動したところ
$ df -h Filesystem Size Used Avail Use% Mounted on udev 492M 12K 492M 1% /dev tmpfs 100M 348K 99M 1% /run /dev/xvda1 9.8G 3.1G 6.2G 34% / none 4.0K 0 4.0K 0% /sys/fs/cgroup none 5.0M 0 5.0M 0% /run/lock none 497M 0 497M 0% /run/shm none 100M 0 100M 0% /run/user
ディスク使用率34%になった。
herokuでアドオン使わずにcron (Python)
herokuにはcronがない。で、どうやってcron的な定期実行を実現するかというと王道はHeroku Schedulerというアドオンを使うらしい。ただ、アドオンを使うとなると基本的に無料とはいえクレジットカードを登録する必要があってそれが嫌だったのでアドオン使わない方法で実現した。
ソースbot.py
from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() @sched.scheduled_job('interval', minutes=3) def timed_job(): print('This job runs every three minutes.') sched.start()
APScheduler
が必要なのでインストールして
$ pip install apscheduler
requirements.txt
に以下の行を追加する。
APScheduler==3.0.3
Procfile
を書いて
bot: python bot.py
bot.py
,requirements.txt
,Procfile
をcommitしてデプロイ。
$ git push heroku master
あとは
$ heroku ps:scale bot=1
でプロセス1個割り当てれば3分おきにジョブが走るのを確認できる。
2015-05-24T10:24:15.052174+00:00 heroku[bot.1]: Starting process with command `python bot.py` 2015-05-24T10:24:15.662122+00:00 heroku[bot.1]: State changed from starting to up 2015-05-24T10:27:16.551515+00:00 app[bot.1]: This job runs every three minutes. 2015-05-24T10:30:16.551654+00:00 app[bot.1]: This job runs every three minutes. 2015-05-24T10:33:16.554967+00:00 app[bot.1]: This job runs every three minutes.
平日毎日夕方5時、みたいな指定も可能。ただし実行時刻はUTC(協定世界時)になるので注意。
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=17) def scheduled_job(): print('This job runs every weekday at 5pm.')
VMware Tools 9.9.2 + kernel 3.19で共有フォルダがマウントできなくなった時の対応
VMware player 7.1.0 (on Windows) + lubuntu 15.04 (kernel 3.19)で共有フォルダ機能を使おうとしたけどなぜか全然マウントされない。いつものようにVMware Tools再インストールで解決*1しようとしたら共有フォルダ関連のところでコンパイルエラー。正確なエラーメッセージは忘れたけどこんな感じでfile構造体にf_dentryなんてメンバはないと言われる。
/tmp/modconfig-1Xsnv4/vmnet-only/driver.c:1194:20: error: ‘struct file’ has no member named ‘f_dentry’ if (filp && filp->f_dentry) { ^
さてどうするかなとググったところ、既にパッチがあったのでありがたく利用させていただく。このリポジトリにある13-vmhgfs-f_dentry-kernel-3.19-tools-9.9.2.patchがそれ。 github.com
手順はほぼREADMEのとおりだけど以下かんたんに日本語で。以下すべてゲストマシンでの作業になる。
当該パッチを含むリポジトリをクローン
$ git clone https://github.com/rasa/vmware-tools-patches.git
READMEの手順2は独自パッチを使いたい場合なので今回はスキップしてOK.
VMware Tools本体(VMwareTools-9.9.2-xxxxxxx.tar.gz)をリポジトリルートに置いたら*2、スクリプトにより展開+パッチ適用
$ cd vmware-tools-patches $ ls VMwareTools* VMwareTools-9.9.2-2496487.tar.gz $ ./untar-and-patch.sh
ビルド+インストール
$ ./compile.sh
無事ビルドが通り、共有フォルダがマウントされるようになりました。
Google I/O 2014で発表されたCardboardを組み立ててみた
これ。Cardboard
完成まで
実際用意したもの
100均で3点購入、税込み324円。
公式サイト情報 | 今回 |
---|---|
段ボール。ピザの箱ならエクストララージサイズ | 家にあった普通の段ボール箱を利用。みかん箱より一回り小さめ、これで2セット作れる感じ |
焦点距離45mm程度*1のレンズ2枚 | 100均で購入。後述 |
磁石2つ。直径19mm厚さ3mmで片方はドーナツ型の | 用意できず。後述 |
面ファスナー20mmx30mm 2セット | 100均で購入。いわゆるマジックテープ |
輪ゴム | 家にあった普通の輪ゴム。本来とは違う目的で使った。後述 |
NFCタグ | 用意せず。あったらCardboardにスマートフォンをセットするだけでアプリが起動して便利っぽい |
スマートフォンはNexus 5を使っています。
組み立て
- 型紙Cardboard Design Filesをダウンロード、印刷して段ボール紙に貼る
- 切り抜いて、Cardboardページ冒頭のパラパラ漫画(?)のように折り曲げていけば完成
小学校の工作みたいで楽しい。
レンズは100均で買えた
材料の中で一番入手が難しそうなのが「焦点距離45mm程度のレンズ2枚」。カメラ用のちゃんとしたレンズならまだしも、安物のプラスチックレンズに焦点距離なんて書いてないのでとりあえず買ってみるしかない。
でも運良く100均(ダイソー)で入手しました。これ。
焦点距離がちょうどいい上、レンズは指で強く押すだけで外れるので最適。ヨドバシで税込103円のルーペも買いましたが、こちらは焦点距離80mm程度で残念ながら使えず。
外側に輪ゴムかかってるけど本来は不要
輪ゴムは本来スマートフォンが滑り落ちるのを防ぐために本体内側で使うようですが、その必要性は感じませんでした。面ファスナーのホールド力で十分。
それよりも、本体をいつでも分解/再組み立てできるようにしておいたほうが後々便利そうなので、糊付けの代わりに使ってます。ちょっとかっこわるいけど。
磁石は無くてもなんとかなる
磁石は本体側面に設置して、物理キーとして使います。磁石をスライドすることで発生する磁場の変化を捉えてアプリ内で様々なトリガとして扱うようです(MagnetSensorで取得できる)。
デモアプリ内ではもっぱら「決定ボタン」の扱いで、画面ダブルタップでも同じ意味になるのですが、構造上画面は指では触りにくい。そこで細くたたんだアルミ箔をタッチスクリーン表面(左右視野境界上で邪魔にならない部分)から本体外側にひいてきてそこをタップするようにしました。問題なく使えています。(しかしこうして見ると切り口が雑なのがバレますね。)
実際使ってみて
操作方法
最初のうち「戻る」をどうやってやるのか分からなかったんですがちゃんとチュートリアルで説明されてました。
操作 | 方法 |
---|---|
メニュー選択 | その方向に顔を動かす |
進む | 磁石スライドか画面ダブルタップ |
戻る | 右に90度傾ける |
自分で撮影したものが見られるのも楽しい
デモアプリには今のところ上記8つのメニューがあってどれも結構楽しいです。Photo Sphereでは自分がKitKat Androidのカメラアプリを使ってPhoto Sphereモードかパノラマモード撮影した風景に入り込むような感じで眺めることができます。最近旅行へ行くたびにこのモードで撮りためてる身としては嬉しい。
その他
- せっかくAPIもあるし何か作ってみようかな、と思ってましたがとりあえず段ボール組み立てて与えられたコンテンツ見たらすっかり満足してしまいました
- 段ボールたくさんジョキジョキするので結構ゴミが出ます
*1:公開当初は40mmだったような?現在(2014-06-29AM)は45mmと書いてあります
Repoを使わずGerritにuploadする
基本的な方法
refs/for/branchnameというおまじないref *1 にpushすればrepo upload
したとき同様レビューにあげることができる。
例えばgit.example.comというGerritサーバにホストされているkernel/commonプロジェクトのexブランチにあげたい場合は
$ git push ssh://sainoky@git.example.com:29418/kernel/common HEAD:refs/for/ex
ショートカット(1)
特定のGerritサーバによくgit pushする場合は、~/.ssh/config
に設定を書いておくと少し楽になる。
$ cat ~/.ssh/config ... Host rv Hostname git.example.com Port 29418 User sainoky $ git push rv:kernel/common HEAD:refs/for/ex
ショートカット(2)
さらにreviewerも同時に指定したい場合はgit receive-pack
を利用して
$ git push --receive-pack='git receive-pack --reviewer=a@a.com' rv:kernel/common HEAD:refs/for/ex
同じプロジェクト/ブランチ/reviewerでgit pushする機会が多いならこれらも適宜ショートカットしたい。
$ cat .git/config ... [remote "rv-ex"] url = rv:kernel/common receivepack = git receive-pack --reviewer=a@a.com push = HEAD:refs/for/ex $ git push rv-ex
*1:このrefは実際には存在しない。Gerritは独自のSSH/Gitスタックをもっていて、これがGit clientに対してはあたかもrefs/for/branchnameが存在しているかのように振る舞う。 参考: Gerrit - Gritty Details
Androidでシリアルコンソール
シリアルポートからログ出し+ログインできるようにする方法3ステップ。 USB接続が使えない時に便利。
シリアルポートドライバを有効化
CONFIG_SERIAL_MSM_HS=y CONFIG_SERIAL_MSM_HSL=y CONFIG_SERIAL_MSM_HSL_CONSOLE=y
ログイン待ち受け設定
Androidには/etc/inittabもなければgettyも無い。代わりとなるのがinit.rcのこの部分。通常は記述があるはずなので触らなくてOK.
service console /system/bin/sh class core console disabled user shell group log on property:ro.debuggable=1 start console
user shell
とgroup log
を削除すればrootでのログインも可能。
シリアルttyデバイスを指定
カーネルのブートパラメータで指定する。例えば115200bps、8bit、パリティ無しでttyHSL0をコンソールとして使用する場合なら
console=ttyHSL0,115200n8
を追加。
device treeをVimでシンタックスハイライト
syntaxファイルを作成・公開されてる方がいるのでありがたく使わせていただく。 https://github.com/b4winckler/macvim/blob/master/runtime/syntax/dts.vim
コメントや変数の部分がハイライトされて分かりやすくなった。
スクリーンショットはraspberry pi kernelのarch/arm/boot/dts/bcm2835.dtsiからとりました。https://github.com/raspberrypi/linux/blob/rpi-3.12.y/arch/arm/boot/dts/bcm2835.dtsi#L50