GNU/Linux >> Linux の 問題 >  >> Ubuntu

UbuntuのIncronでファイルまたはディレクトリの変更に対してコマンドを実行する方法

このチュートリアルでは、Ubuntuシステムでincronを使用して、ファイルまたはディレクトリが変更されたときにコマンドを実行する方法を示します。 incronデーモンはcronに似ていますが、時間に基づいてコマンドを実行する代わりに、ファイルまたはディレクトリのイベント(ファイルの変更、権限の変更など)が発生したときにコマンドをトリガーできます。

1Incronのインストール

次の手順は、rootユーザーとして実行する必要があります。 Ubuntuシステムのシェルにログインし、次のコマンドでrootになります:

 sudo su 

IncronソフトウェアはUbuntuリポジトリで入手できます。したがって、次のようにaptを使用してインストールします。

 apt-get install incron 

3インクロンの使用方法

最初の章で述べたように、IncronにはCronツールと多くの類似点があります。 Cronにはcronジョブを管理するためのcrontabコマンドがありますが、Incronにはコマンドincrontabがあります。 incrontabコマンドのオプションリスト(-l)、編集(-e)、および削除(-r)を使用して、incrontabエントリを表示および変更できます。

次のコマンドを実行して、incrontabの概要を確認します。

 man incrontab 

マニュアルページには、次のメモがあります。

/etc/incron.allowが存在する場合、ここにリストされているユーザーのみがincronを使用できます。それ以外の場合、/ etc / incron.denyが存在する場合、ここにリストされていないユーザーのみがincronを使用できます。これらのファイルが存在しない場合、誰もがincronを使用できます。 (重要な注意:この動作は安全ではなく、ISC Cronで使用されるスタイルと互換性があるように変更される可能性があります。)これらのファイルの場所は、構成で変更できます。

つまり、incrontabをrootとして使用する場合は、/ etc / incron.allowを削除する必要があります(これは安全ではありません)...

 rm -f /etc/incron.allow 

...またはrootユーザーをincron.allowファイルに追加します(これは推奨オプションです)。 /etc/incron.allowファイルを開きます:

 nano /etc/incron.allow 

そして、次の行を追加します。

 root 

これを行う前に、incrontabを使用しようとすると、次のようなエラーメッセージが表示されます。

 server1:〜#incrontab -l <​​br /> user'root'はincronの使用を許可されていません
server1:〜#

その後は機能します:

 server1:〜#incrontab -l <​​br />rootのテーブルがありません
server1:〜#

これで、次のコマンドを使用できます:

 incrontab -e 

incronジョブを作成します。それでは、構文を理解するためにマニュアルページを詳しく見てみましょう。

 man 5 incrontab 

マンページには、cronタブ行の形式が示されています。形式は次のスキームに従います:

    

...ここで、はディレクトリまたはファイルです。 incronは、設定したディレクトリのサブディレクトリ内のファイルを監視できないため、そのディレクトリ内のファイルのみが監視されることに注意してください。

は、次のいずれかのオプションになります。

 IN_ACCESSファイルにアクセスしました(読み取り)(*)
IN_ATTRIBメタデータが変更されました(権限、タイムスタンプ、拡張属性など)(*)
IN_CLOSE_WRITE /> IN_CLOSE_NOWRITE書き込み用に開かれていないファイルが閉じられました(*)
IN_CREATE監視対象ディレクトリに作成されたファイル/ディレクトリ(*)
IN_DELETE DELETE * IN _ /directory自体が削除されました
IN_MODIFYファイルが変更されました(*)
IN_MOVE_SELF監視対象のファイル/ディレクトリ自体が移動されました
IN_MOVED_FROM視聴したディレクトリ(*)
IN_OPENファイルが開かれました(*)

ディレクトリを監視する場合、上記のアスタリスク(*)でマークされたイベントは、ディレクトリ内のファイルで発生する可能性があります。その場合、
返されたイベントデータの名前フィールドは、ディレクトリ内のファイルの名前を識別します。

IN_ALL_EVENTSシンボルは、上記のすべてのイベントのビットマスクとして定義されています。 2つの追加の便利なシンボルは、IN_MOVED_FROMとIN_MOVED_TOの組み合わせであるIN_MOVEと、IN_CLOSE_WRITEとIN_CLOSE_NOWRITEを組み合わせたIN_CLOSEです。

マスクには、さらに次の記号を指定できます。

IN_DONT_FOLLOWシンボリックリンクの場合はパス名を間接参照しないでください
IN_ONESHOT1つのイベントのみのパス名を監視します
IN_ONLYDIR

さらに、inotifyシンボルセットに表示されないシンボルがあります。 IN_NO_LOOPです。このシンボルは、現在のイベントが完全に処理されるまで(子プロセスが終了するまで)、イベントの監視を無効にします。

は、イベントが発生したときに実行する必要のあるコマンドです。コマンド仕様内では、次のワイルドダードを使用できます。

$$ドル記号
[メールで保護]監視対象のファイルシステムパス(上記を参照)
$#イベント関連のファイル名
$%イベントフラグ(テキスト)
$&イベントフラグ(数値)

ディレクトリを監視している場合、[email protected]はディレクトリパスと$#イベントをトリガーしたファイルを保持します。ファイルを監視している場合、[メールで保護]はファイルへの完全なパスを保持し、$#は空です。

ワイルドカードが必要であるが、それらが何に変換されるかわからない場合は、このようなincronジョブを作成できます。

監視するディレクトリを作成します:

 mkdir / tmp / testdir 

次に、incrontabを開きます:

 incrontab -e 

次の行を追加します:

 / tmp / testdir / IN_MODIFY echo "$$[メール保護]$#$%$&" 

次に、/ tmp / testdir /ディレクトリにファイルを作成または変更し、/ var / log / syslogを確認します。このログには、incronジョブがトリガーされたタイミング、成功したかエラーが発生したか、実際のログが表示されます。コマンドは実行されました(つまり、ワイルドカードは実際の値に置き換えられます)。

テストのために、 helloworld.txtという2つのファイルを追加します。 および/tmp / testdir /のhelloworld2.txt echoコマンドを使用する場合:

 echo'お元気ですか?'> /tmp/testdir/helloworld.txt 
echo'お元気ですか?'> /tmp/testdir/helloworld2.txt

それでは、incron ecentsのテール付きのsyslogを確認しましょう:

 tail / var / log / syslog 
 ... 
Apr 12 18:49:22 server1 incrond [6441]:(root)CMD(echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18 :50:31 server1 incrond [6441] :(ルート)CMD(echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")

今では十分な理論。最初のincronジョブを作成しましょう。ファイル/etc/apache2/apache2.confとディレクトリ/etc/ apache2 / vhosts /を監視したいのですが、変更があるたびに、incronでApacheを再起動します。これが私たちのやり方です:

 incrontab -e 
 /etc/apache2/apache2.conf IN_MODIFY / usr / sbin / service apache2 restart / etc / apache2 / sites-available / IN_MODIFY / usr / sbin / service apache2 restart 

それでおしまい。テストの目的で、Apache構成を変更し、/ var / log / syslogを確認すると、incronがApacheを再起動することがわかります。

:ループを回避するために、監視しているディレクトリのincronジョブ内からアクションを実行しないでください。 例: / tmpディレクトリの変更を監視し、変更のたびに/ tmpにログファイルを書き込むスクリプトがトリガーされると、ループが発生し、システムの負荷が高くなったり、クラッシュしたりする可能性があります。

定義されているすべてのincronジョブを一覧表示するには、次のコマンドを実行できます。

 incrontab -l <​​/ pre> 
 server1:〜#incrontab -l <​​br /> /etc/apache2/apache2.conf IN_MODIFY / usr / sbin / service apache2 restart 
/ etc / apache2 / vhosts / IN_MODIFY / usr / sbin / service apache2再起動
server1:〜#

現在のユーザーのすべてのincronジョブを削除するには、次のコマンドを実行します。

 incrontab -r 
 server1:〜#incrontab -r
ユーザー'root'のテーブルを削除しています
ユーザー'root'のテーブルが正常に削除されました
server1:〜#

  • incron:http://inotify.aiken.cz/?section=incron&page=about&lang=en

Ubuntu
  1. Ubuntuにdebファイルをインストールする方法(例付き)

  2. Ubuntuデスクトップをダブルクリックしてファイルを開くときに作業ディレクトリを変更するにはどうすればよいですか?

  3. ファイルまたはディレクトリが変更されたときにシェルスクリプトを実行する方法は?

  1. Ubuntu20.04にGoをインストールする方法

  2. DebianEtchのIncronでファイル/ディレクトリの変更に関するコマンドをトリガーする

  3. Ubuntu16.04でHadoopMapReduceプログラムを実行する方法

  1. Debian8でIncronを使用してファイル/ディレクトリの変更でコマンドをトリガーする方法

  2. DebianでIncronを使用してファイル/ディレクトリの変更でコマンドをトリガーする方法

  3. Ubuntu18.04LTSでパスワードでZipファイルを保護する方法