WSLとDrvFsとinotifyのMOVE_SELFの挙動の話
WSLの上で動かしているwebpack(watchしている状態)を使っていたら少し不思議な挙動に遭遇したのでメモ。
起こった現象
- DrvFS上のファイルをwebpackで監視して、変更があったらビルドするようにした
- Windows側のプロセスであるPhpStormからファイルを変更した
- WSL側から見ると全くファイルが更新されていないように見える
もうちょっと詳しく調べてみる
inotify-tools
のinotifywait
を使用するとどんな通知が飛んでくるか確認できるので、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が使えないので、何とかしたい。
safe write
を使用するオプションをオフにすることでこの現象が起こるのを回避できる。