もやし日誌

日記のようなもの

WSLとDrvFsとinotifyのMOVE_SELFの挙動の話

WSLの上で動かしているwebpack(watchしている状態)を使っていたら少し不思議な挙動に遭遇したのでメモ。

起こった現象

  • DrvFS上のファイルをwebpackで監視して、変更があったらビルドするようにした
  • Windows側のプロセスであるPhpStormからファイルを変更した
  • WSL側から見ると全くファイルが更新されていないように見える

もうちょっと詳しく調べてみる

qiita.com

inotify-toolsinotifywaitを使用するとどんな通知が飛んでくるか確認できるので、PhpStormでファイルを編集しながらどんなイベントが起こるか確認してみた。

$ inotifywait -m penlight-item.vue
Setting up watches.
Watches established.
penlight-item.vue MOVE_SELF
penlight-item.vue MODIFY
penlight-item.vue ATTRIB

注目したいのはMOVE_SELFである。これは監視対象のファイルが移動されたことを意味する。

また、監視中にWSL側から対象のファイルをcatしてみてもgit diffしてみても全くファイルが更新されていないように見え、inotifywaitを終了させると終了した瞬間にファイルが更新されることも分かった。

inodeも確認してみる

ls -iでファイルのinodeが確認できるので確認してみる。

$ ls -i
70368744177769493 character-item.vue*        6473924466916263 main-view.vue*       1970324839556962 penlight-list-view.vue*
13510798882202666 character-list-view.vue*  32088147347008203 penlight-item.vue*

変更前のinodeは34902897112164784 penlight-item.vue*だったので、ファイルが移動され別のファイルがリネームされて今あるファイルになったことが分かる。

WSL特有の挙動

ファイルのinotifyイベントを監視中にWindows側から対象ファイルを移動(リネーム)し、別に作ったファイルを元のファイルの名前に変更すると、WSL側からは移動する前の段階でのファイルの中身が残ったような状態になる。

監視を終了させると、更新後のファイルの中身が見えるようになり、inodeも変化する。

IDEA系のIDEでの対処法

このままだとまともにwebpackが使えないので、何とかしたい。

f:id:kazuki09:20190429204748p:plain

safe writeを使用するオプションをオフにすることでこの現象が起こるのを回避できる。