kledgeb Ubuntuの使い方や日本語化、アプリの使い方を紹介しています。

Inotifyとファイルシステムの変更通知のサポート

前回紹介した通り「Build 14942」にてファイルシステムの変更通知の実装が改善されました。


DrvFs(Windowsのボリュームのこと)」上でWindowsアプリから行われたファイルシステムの変更を「Inotify」で検出できるようになりました。


ここ数週間に渡り、WSLのチームは多くの不具合の修正やWindows 10 Anniversary Updateに間に合わなかった様々な計画の完遂、及び新たな機能のサポートに奮闘してきた。

多くの開発者が待ち望んでいた機能の一つが、Inotifyのサポートである。
InotifyはLinux kernelに実装されている機能であり、他のOSでも類似した機能を提供している。

例えばWindowsでは、Win32 Directory Change Notifications API.NET FileSystemWatcher() APIを通じてファイルシステムの変更通知を受け取ることができる。
ファイルシステムの変更通知により、アプリは自身が関心を持つファイルやディレクトリーの変化を監視することができる。

例えばLinuxの「tail -f ...」やPowerShell の「cat ... -wait」コマンドは、指定されたファイルの内容を表示し、ファイルの内容に変化があればその変化に追従して変更された内容を表示する。
この機能はログの監視やソフトウェアの動作を追従する時に役に立つ。

同様にnodemonのようなツールは、ソースファイルの内容が変化すれば自動的にnode.jsサービスアプリケーションを再起動し、劇的に開発者の生産性を向上させる。

もしLinuxとWindowsの両方でファイルシステム変更通知がサポートされ、お互いに連携して動作するようになれば、それは素晴らしいことである。

例えばWindowsでファイルの内容を編集すれば、Bashやファイルシステム変更通知を利用している他のWindowsアプリケーションは更新通知を受け取り、変更された内容で処理を行える。

そう、まさしくそれがWindows 10 Insiders build #14942で利用可能になったのだ。

この機能のデモンストレーションを行ってみよう。
以下の手順に従えば、あなたは上記で記述した内容をイメージできるだろう。

1.Windowsで「c:¥temp」フォルダーを作成する
2.メモ帳を開き「Hello」と入力し、「c:\temp\hello.txt」にファイルを保存する
3.Bashを起動し、カレントディレクトリーを「cd /mnt/c/temp/」に移動する
4.Bashで「tail -f hello.txt」を実行する
5.PowerShellを起動し、カレントディレクトリーを 「cd c:\temp\」に移動する
6.PowerShellで「cat hello.txt -wait」を実行する
7.メモ帳に戻り、何か適当な文字列を入力して保存する。すると入力した内容がBashとPowerShellに表示される。

留意点:
・改善されたInotifyを利用するには、Windows 10 Insiders build #14942を利用しているひつようがある。

・ Bashで以下のエラーが出力されても、気にしなくて良い。
「 “tail: unrecognized file system type 0x53464846 for ‘hello.txt’. please report this to bug-coreutils@gnu.org. reverting to polling”」


試してみよう

上記の手順に従い、実際に試してみます。

1.Windowsで「c:¥temp」フォルダーを作成する

Windowsで「c:¥temp」フォルダーを作成します。


2.メモ帳を開き「Hello」と入力し、「c:\temp\hello.txt」にファイルを保存する

ここでは例として、以下のように日本語を入力しました。


2-1.ファイルの保存

「c:\temp\hello.txt」に保存します。


日本語が含まれているので、文字コードに「UTF-8」を指定しています。

2-2.保存完了 

以下のようにテキストファイルが「c:¥temp」フォルダーに生成されます。


3.Bashを起動し、カレントディレクトリーを「cd /mnt/c/temp/」に移動する

Bashを起動後以下のコマンドを実行し、カレントディレクトリーを「/mnt/c/temp/」に設定します。

cd /mnt/c/temp/


4.Bashで「tail -f hello.txt」を実行する

Bashで「tail -f hello.txt」を実行します。

tail -f hello.txt


テキストファイルの中身が表示されます。
出力された内容の頭に中点が表示されるのは、テキストファイルにBOMが付いているためです。


5.PowerShellを起動し、カレントディレクトリーを 「cd c:\temp\」に移動する

Bashを起動後以下のコマンドを実行し、カレントディレクトリーを「c:\temp\」に設定します。

cd c:\temp\


6.PowerShellで「cat hello.txt -wait」を実行する

PowerShellで「cat hello.txt -wait」を実行します。

cat hello.txt -wait


7.メモ帳に戻り、何か適当な文字列を入力して保存する

メモ帳に戻り、何か適当な文字列を入力して保存します。
ここでは以下のように文字列を追記しました。


PowerShell

PowerShellのウィンドウに切り替えると、以下のように追記した文字列が出力されています。


Bash

Bashのウィンドウに切り替えると、以下のように追記した文字列が出力されています。


文字コードに気をつけよう

Bash(Ubuntu)のデフォルトの文字コードであるBOMなしUTF-8を文字コードに使用すると、変に文字化けしなくて済みます。


関連記事一覧
オプション