Aug 04, 2014

Vagrant + NFS な開発環境でのアプリ自動再起動

Vagrant で NFS 使っての開発環境で、ローカルでファイル変更してるんだけど VM 上の plack -R が変更検知してくれないなぁ、とおもってしばらく使ってたけど、やっぱり不便なので調べたらどうやらこれは NFS と Inofity の問題でどうしようもなさそうだった。

http://stackoverflow.com/questions/4231243/inotify-with-nfs

-R の実装である Plack::Loader::Restarter が使う Filesys::Notify::Simple では Linxu::Inofity2 なければ、File::Find 使ってフルスキャンしつつの変更検知ができるようにはなってる。それでええやん、というのもあるがバッテリー作業時の電池節約もしたいので別の方法を模索。

今回はもともと Grunt 使ってたのもありどうせならということで Grunt で完結するようにしてみた。

HTTP::Server::PSGI 使ってたこんなような Procfile のところを、

admin: plackup -p 9001 -R lib -a conf/admin.psgi

(どうせ本番で使う)Server::Starter + Starlet の構成にして pid をファイルに記録しつつの起動に変更。

admin: start_server --port=9001 --pid-file=var/run/admin.pid -- plackup -a conf/admin.psgi -s Starlet --max-workers=1

Grunt では watch で .pm ファイル達を監視しつつの exec するタスクを追加。

watch:
  apps:
    files: ['lib/**/*.pm']
    tasks: ['exec:reload']
exec:
  reload:
    command: 'vagrant ssh -c "kill -HUP `cat /vagrant/var/run/admin.pid`" -- -t'

これでローカルで Grunt 走らせておけば変更検知しての再起動がいい感じに。

ただし、grunt-contrib-watch は非常に負荷が高いようなので grunt-este-watch に移行したほうが良さそう(ファイル数にもよるだろうけど実際ロードが 20% ぐらい上がった)。

http://tech.nitoyon.com/ja/blog/2013/10/10/grunt-watch-slow/

とりあえずまともに動く plack -R の代替ができて普通の状態に戻った。

Comments