2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

15.0-RELEASE の inotify でファイルが作成されたことを馬(?)から教えてもらうようにする

Posted at

FreeBSD 15.0-RELEASE の新機能

15日目
https://qiita.com/s_mitu/items/2efa89458cad6b9db440

18日目
https://qiita.com/s_mitu/items/4c6f614312d93ca29cff

と連続して FreeBSD 15.0-RELEASE をディスってるのか?という記事を書いてしまいましたが、新機能の記事も書いておかないと。

 15.0-RELEASE では Linux のファイルシステム監視API inotify が使えるようになりました。FreeBSD では似たような機能として kqueue / kevent システムコールがありますが、Linux からの移植で FreeBSD の作法に合わせるのは手間でしょう。移植の面倒そうな箇所なので、そこが Linux のコードそのままで動くことになり、FreeBSD で動くソースコードが増えることにつながり、FreeBSD ユーザーに潤いをもたらすことでしょう。

inotify でできること

 inotify とは、ファイルシステムのイベント、例えばファイル作成やオープン/クローズ、削除や更新などをカーネルからイベントとして通知してもらえるシステムコールです。ファイル作成をループでチェックし続けるというユーザーランドでの努力をしなくていいのはかっこいいですね。
 環視はファイル単体だけでなくディレクトリに対しても行えるので、特定のディレクトリ内直下(サブディレクトリ内は別)のイベントをまとめてチェックできるのは嬉しい場面が多そうです。

詳細は man inotify にありますが、

クローズイベントも

  • IN_CLOSE_WRITE
    書き込みオープンしたファイルのクローズ
  • IN_CLOSE_NOWRITE
    リードオンリーオープンしたファイルのクローズ

といった細かさでイベントが分かれており、かなり詳細に何が起こったか検知できることがわかります。

具体的な使い方はサンプルを見て動かすのが手っ取り早い

 この新機能を試すのに自分でコードを書くのが一番勉強になりますが、「そんなのまどろっこしい、実際の動きがさっさと見たい!」というのも人情です。
 そんなあなたにサンプルコードが /usr/share/examples/inotify に入っています。中に入っている inotify.c は inotify を使ったサンプルコードとなっています。またこのディレクトリを適当な書き込み領域にコピーして

% cd inotify 
% make

してあげると inotify が作成され、動きの実際の確認もできます。

 サンプルは

./inotify (ファイル名 または ディレクトリ名)

とすることで、ファイルやディレクトリの環視を開始します。

 ファイル aaa に対して ./inotify aaa として、

touch aaa とすると

   1        IN_ATTRIB 

cat aaa とすると

  1          IN_OPEN 
  1        IN_ACCESS 
  1 IN_CLOSE_NOWRITE 

echo data >> aaa とすると

  1          IN_OPEN 
  1        IN_MODIFY 
  1   IN_CLOSE_WRITE 

といったイベントが飛ぶことがわかります。

ディレクトリ ddd に対して ./inotify ddd を実行すると、

touch ddd/bbb とすると

  1        IN_CREATE bbb
  1          IN_OPEN bbb
  1   IN_CLOSE_WRITE bbb

mv ddd/bbb ddd/ccc とすると、

  1    IN_MOVED_FROM bbb
  1      IN_MOVED_TO ccc

などといったイベントが飛ぶことがわかります。

inotify でファイルの作成を監視し、デスクトップに通知する

 inotify.c を見れば実際のコーディングの仕方がわかると思いますし、丸パクリしてイベント処理している switch 文のところにイベントで実行させたい処理を記述するといったカスタマイズでも用が足りることもあると思います。
 今回はこの inotify サンプルをそのまま使い、ディレクトリにファイルが作成されたらデスクトップに通知するシステム的なものを作ってみます。
通知には xcowsay (ports では games/xcowsay) を使ってみます。文字列を指定すると、牛の絵と吹き出しでデスクトップにメッセージを表示します。pkg install xcowsay でインストールして

xcowsay 牛です

を実行すると、

ushi.png

と表示されます。

 しかし 2026年は午年。xcowsay は --image=画像ファイル名 で画像が差し替えられるので、午(馬)の絵に変えてみます。

 そんなときたのもしいのはいらすとやさん。ということで話題になった馬の絵

を縮小した small_eto_centaur_happy.png を作成し、xcowsay --image=small_eto_centaur_happy.png 〜 と指定して使ってみます。

実際のコマンドとしては

./inotify ddd | 
     sed -u -e '/IN_CREATE/s/.* IN_CREATE //p;d' | 
     xargs -n 1 -I % xcowsay --image=small_eto_centaur_happy.png --at=1800,50 % ファイルできた

とします。

  • ddd ディレクトリ直下にファイルが作成されると IN_CREATE 〜 文字列が出力される。
  • sed でファイル名を抽出する(-u をつけてバッファリングされないようにして逐次実行されるようにする)
  • xargs -n 1 で文字列一つ来たら xcowsay を実行する(--at=X,Y で表示位置を右上にしている)。

 これでddd ディレクトリ以下にファイルを作成すると、以下のようにデスクトップ通知されるようになります。

uma-report.png

 とりあえずファイルができただけで大げさにめでたい感じになりました。

まとめ的なしめくくり

 なんか後半は無理やり祝賀感を出してみましたが、ファイルシステム環視システムコールはかなり応用範囲が広いので、こ今回導入された inotify や従来の kqueue などについて、注目する一助にこの記事がなれば幸いです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?