inotifywait を使って,ファイルが作成されたらアクションを起こすスクリプトを書く

例えば,ディレクトリ /tmp/hoge に print.ps というファイルが作成されたら,それを自動的に印刷するようにしたい場合,ファイル作成イベントを監視する必要がある. inotifywait というコマンドを使えばそれが簡単にできるので,紹介する.
次のbashスクリプトは, /pstmp というディレクトリにファイルが作成されたら,そのファイルを別ユーザアカウントで kghostview で開く,というものだ*1

#!/bin/bash
# required package: inotify-tools
psout_dir=/pstmp
m_account=aki-yam

events=(-e CREATE -e MODIFY -e MOVED_TO)
while inotifywait ${events[@]} $psout_dir; do
  psfile=$psout_dir/`ls -rt $psout_dir | tail -n1`
  echo "new ps file: $psfile"
  chmod 644 $psfile
  kdesu -u $m_account kghostview $psfile
done

ここで使われている inotifywait というコマンドは (debianだと) inotify-tools パッケージに含まれているので,インストールしておく必要がある.このスクリプトは, ~/.xsession とかにバックグラウンドで実行されるように書いておけばよい.

さて,inotifywait は,

inotifywait -e イベント ファイルorディレクトリ

のように使うと,「ファイルorディレクトリ」で「イベント」が発生するまで待機する.上のスクリプトでは

inotify-tools -e CREATE -e MODIFY -e MOVED_TO /pstmp

のように使っているから,/pstmp ディレクトリで CREATE (作成), MODIFY (変更), MOVED_TO (に移動) のいずれかのイベントが発生するまで待機し,イベントが発生したら do 以下を実行するようになっている.

do 〜 done は,まず psfile に最新のファイルを代入し,それを echo, さらに, $m_account ユーザで kghostview コマンドを実行するというもの. kdesu は別ユーザでXを使うコマンドを実行するKDEのコマンド,kghostview はKDEのpsビューアである.単に印刷するだけなら do 〜 done は,

  psfile=$psout_dir/`ls -rt $psout_dir | tail -n1`
  echo "new ps file: $psfile"
  sudo -u $m_account lp $psfile

みたいな感じでいいと思うが,両面印刷とかのオプションを手軽に変更できるように kghostview を利用するようにしている.

さらに,KDE のプリントマネージャを起動し,「追加-特殊(疑似)プリンタを追加」を選択,コマンド設定のところに

cp %in /pstmp/`basename %in`

と設定すれば,通常のプリンタみたいに扱えるようになる.


ちなみに何でこんなスクリプトを作ったかというと,ウチの大学が個人マシンのアカウント名と大学のアカウント名を一緒にしないと印刷できないようにしてしまったからだよ! 印刷するために,イチイチpsファイルを生成して sudo -u ... とかやってたらめんどくさくてしかたないよ!

*1:修正@Apr.14,2009: chmod を加えた.kdesuの&を消した.