このガイドでは、Debian Etchシステムにincronをインストールして使用する方法を示します。incronはcronに似ていますが、時間に基づいてコマンドを実行するのではなく、ファイルやディレクトリのイベントが発生したときにコマンドをトリガーできます(例:ファイルの変更、権限の変更など)。
この文書には、いかなる種類の保証もありません!これがあなたにとって機能するという保証はありません!
1 Incronのインストール
Incronはetch-backportsリポジトリで利用可能なので、次の行を/etc/apt/sources.listに追加する必要があります:
| [...] deb http://www.backports.org/debian etch-backports main contrib non-free [...] |
バックポート.orgアーカイブキーをaptにインポートしましょう…
wget -O - http://backports.org/debian/archive.key | apt-key add -
…そして実行します
etch-backportsリポジトリはデフォルトでは非アクティブなので、そこからincronをインストールするには、次のコマンドを使用する必要があります:
apt-get -t etch-backports install incron
2 Incronの使用
Incronの使用はcronの使用に非常に似ています。incrontabコマンドを使用して、incrontabエントリをリスト( -l)、編集( -e)、削除( -r)できます。詳細については、次を参照してください
そこには次のセクションもあります:
もし/etc/incron.allowが存在する場合、ここにリストされているユーザーのみがincronを使用できます。そうでない場合、/etc/incron.denyが存在する場合、ここにリストされていないユーザーのみがincronを使用できます。これらのファイルが存在しない場合、誰でもincronを使用できます。(重要な注意:この動作は安全ではなく、ISC Cronで使用されるスタイルと互換性を持つように変更される可能性があります。)これらのファイルの場所は設定で変更できます。
これは、rootとしてincrontabを使用したい場合、/etc/incron.allowを削除する必要があることを意味します(これは安全ではありません。なぜなら、すべてのシステムユーザーがincrontabを使用できるからです)…
…またはそのファイルにrootを追加します(推奨):
| root |
これを行う前に、incrontabを使用しようとすると、次のようなエラーメッセージが表示されます:
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#
その後、動作します:
server1:~# incrontab -l
no table for root
server1:~#
を使用してincronジョブを作成できます。これを行う前に、次を見てみましょう
なぜなら、crontabの形式を説明しているからです。基本的に形式は次のようになります…
…ここではディレクトリ(つまり、そのディレクトリ内のファイルやディレクトリ(そのディレクトリのサブディレクトリ内のファイルではありません!)が監視されます)またはファイルです。
は次のいずれかです:
```
IN_ACCESS ファイルがアクセスされました(読み取り)(*)
IN_ATTRIB メタデータが変更されました(権限、タイムスタンプ、拡張属性など)(*)
IN_CLOSE_WRITE 書き込みのために開かれたファイルが閉じられました(*)
IN_CLOSE_NOWRITE 書き込みのために開かれていないファイルが閉じられました(*)
IN_CREATE 監視ディレクトリにファイル/ディレクトリが作成されました(*)
IN_DELETE 監視ディレクトリからファイル/ディレクトリが削除されました(*)
IN_DELETE_SELF 監視ファイル/ディレクトリが自分自身で削除されました
IN_MODIFY ファイルが変更されました(*)
IN_MOVE_SELF 監視ファイル/ディレクトリが自分自身で移動されました
IN_MOVED_FROM ファイルが監視ディレクトリから移動されました(*)
IN_MOVED_TO ファイルが監視ディレクトリに移動されました(*)
IN_OPEN ファイルが開かれました(*)
```
ディレクトリを監視している場合、上記のアスタリスク(*)でマークされたイベントは、ディレクトリ内のファイルに対して発生する可能性があり、その場合、返されたイベントデータの名前フィールドはディレクトリ内のファイルの名前を識別します。
IN_ALL_EVENTSシンボルは、上記のすべてのイベントのビットマスクとして定義されています。2つの追加の便利なシンボルは、IN_MOVE(IN_MOVED_FROMとIN_MOVED_TOの組み合わせ)とIN_CLOSE(IN_CLOSE_WRITEとIN_CLOSE_NOWRITEの組み合わせ)です。
マスクに指定できるさらに以下のシンボルがあります:
```
IN_DONT_FOLLOW シンボリックリンクの場合、パス名を解決しない
IN_ONESHOT 1つのイベントのためだけにパス名を監視する
IN_ONLYDIR パス名がディレクトリである場合のみ監視する
```
さらに、inotifyシンボルセットには表示されないシンボルがあります。それはIN_NO_LOOPです。このシンボルは、現在のイベントが完全に処理されるまで(その子プロセスが終了するまで)イベントの監視を無効にします。
は、イベントが発生したときに実行されるべきコマンドです。コマンド仕様内で次のワイルドカードを使用できます:
```
$$ ドル記号
$@ 監視されているファイルシステムパス(上記参照)
$# イベント関連のファイル名
$% イベントフラグ(テキスト形式)
$& イベントフラグ(数値形式)
```
ディレクトリを監視している場合、$@はディレクトリパスを保持し、$#はイベントをトリガーしたファイルを保持します。ファイルを監視している場合、$@はファイルへの完全なパスを保持し、$#は空になります。
ワイルドカードが必要ですが、それらが何に変換されるかわからない場合は、次のようにincronジョブを作成できます:
| ```
/tmp/ IN_MODIFY echo "$ $@ $# $% $&"
``` |
その後、/tmpディレクトリ内にファイルを作成または変更し、/var/log/syslogを確認します。このログは、incronジョブがトリガーされたとき、成功したかエラーがあったか、実行された実際のコマンドが何であったかを示します(つまり、ワイルドカードは実際の値に置き換えられます)。
```
tail /var/log/syslog
```
```
...
Aug 21 17:26:50 server1 incrond[7111]: (root) CMD (echo "$ /tmp huhu IN_CREATE 256")
```
この例では、/tmp/huhuというファイルを作成しました。ご覧のとおり、$@は/tmpに、$#はhuhuに、$%はIN_CREATEに、$&は256に変換されます。
さて、理論は十分です。最初のincronジョブを作成しましょう。/etc/apache2/apache2.confファイルと/etc/apache2/vhosts/ディレクトリを監視し、変更があった場合はincronがApacheを再起動するようにしたいと思います。これがその方法です:
```
incrontab -e
```
| ```
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart
``` |
それだけです。テスト目的でApacheの設定を変更し、/var/log/syslogを確認すると、incronがApacheを再起動するのがわかります。
定義されたすべてのincronジョブをリストするには、次を実行できます
```
incrontab -l
```
```
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart
server1:~#
```
現在のユーザーのすべてのincronジョブを削除するには、次を実行します
```
incrontab -r
```
```
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#
```
### 3 リンク
- incron: http://inotify.aiken.cz/?section=incron&page=about&lang=en