2013-02-04 9 views
8

私は起動時に、新しく作成されたファイルのディレクトリを見るための小さなbashスクリプトを書いています。新しいファイルが表示された場合は、その存在が2番目のスクリプトを実行させるようにします。ファイル作成時にbashスクリプトを実行する

最近圧縮されたビデオをトリガして取り込んだ映像のログに追加するために使用されています。

現在、私のコードは次のようになります。

#!/bin/sh 

##VIDSTAT is a global variable coming from a parent script. 
##proj is the ingestion directory coming from a parent script 
proj=$1 

dir="/home/$USER/data/movies/$proj" 
dirlist=$(ls $dir) 


while { $VIDSTAT -eq 1 }: 
do 
    for mov in $dirlist 
    do 
     if [ "$(($(date +"%s") - $(stat -c "%Y" $mov)))" -lt "5" ] 
     then 
     ~/bin/compressNlog.sh $mov 
     fi 
    done 
done 

これを行うには、より簡単に/クリーナー/少ないメモリ集約方法はありますか?

EDITキャプチャセッションごとに取り込みディレクトリを変更します。私は、コードを調整しているに応じてあなたが魔法のinotifyツールでこれを行うことができ

+2

注意してください。アプリケーションがファイルの書き込みを終了する前にスクリプトを実行し、不完全なファイルを圧縮します。 – Barmar

答えて

11

incron?ファイル/ディレクトリの変更に関するコマンドを起動します。

sudo apt-get install incron 

例:<path>ディレクトリをすることができ

<path> <mask> <command> 

は、(そのディレクトリのサブディレクトリに(そのディレクトリに直接ではないファイルをファイルのディレクトリを意味し、および/または)見ている!)、またはファイル。

<mask>は、次のいずれかになります。

IN_ACCESS   File was accessed (read) (*) 
IN_ATTRIB   Metadata changed (permissions, timestamps, extended attributes, etc.) (*) 
IN_CLOSE_WRITE  File opened for writing was closed (*) 
IN_CLOSE_NOWRITE File not opened for writing was closed (*) 
IN_CREATE   File/directory created in watched directory (*) 
IN_DELETE   File/directory deleted from watched directory (*) 
IN_DELETE_SELF   Watched file/directory was itself deleted 
IN_MODIFY   File was modified (*) 
IN_MOVE_SELF  Watched file/directory was itself moved 
IN_MOVED_FROM  File moved out of watched directory (*) 
IN_MOVED_TO   File moved into watched directory (*) 
IN_OPEN    File was opened (*) 

<command>イベントが発生したときに実行されなければならないコマンドです。次wildardsはコマンド指定の内部で使用することができる。

$$ dollar sign 
[email protected] watched filesystem path (see above) 
$# event-related file name 
$% event flags (textually) 
$& event flags (numerically) 

ディレクトリを見た場合、$ @ディレクトリパスと$#イベントをトリガしたファイルを保持しています。ファイルを見ると、$ @はファイルへの完全なパスを保持し、$#は空です。

実施例:

$sudo echo spatel > /etc/incron.allow 
$sudo echo root > /etc/incron.allow 

スタートデーモン:

$sudo /etc/init.d/incrond start 

編集incrontabファイル

$incrontab -e 
/home/spatel IN_CLOSE_WRITE touch /tmp/incrontest-$# 

テストそれ

$touch /home/spatel/alpha 

結果:

$ls -l /tmp/*alpha* 
-rw-r--r-- 1 spatel spatel 0 Feb 4 12:32 /tmp/incrontest-alpha 

注:Ubuntuでは、ブート時にinotifyを有効にする必要があります。 Grubメニューに次の行を追加してください。最初のファイル:

kernel /boot/vmlinuz-2.6.26-1-686 root=/dev/sda1 ro inotify=yes 
+1

これは良い解決策のようですが、取り込みセッションごとにディレクトリを変更します。イントロンテーブルをセッションごとに2回編集する方が効率的でしょうか、それともプロセスとして実行され、その後に終了するソリューションを使用しますか? – Simianspaceman

+0

私はincrontabにエントリを追加するいくつかの問題があります。ユーザーとルートの両方に "incrontabを使用できません"というメッセージが表示される – Simianspaceman

+1

/etc/incron.allowファイルを作成します(ユーザーが許可するファイルであればetc/incron.confをチェックインしてください) – Satish

0

inotifywait -r -m ./YOUR_MONITORED_DIR | 
    while read a b file; do 
     [[ $b == *CREATE* ]] && ./another_script "$file" 
    done 

この方法では、N秒ごとにポーリングを避けるために大きな利点を持っています。

バージョンinotifyは、(iノードが通知)ファイルシステムへの変更に気づき ファイルシステムを拡張し、アプリケーションにそれらの 変更を報告するように作用するLinuxカーネル・サブシステムです。同様の目標を持っていた以前の施設dnotify を置き換えます。

http://en.wikipedia.org/wiki/Inotify
使用iwatchinotify doc

1

を参照してください。いいえ、本当に。デーモンの作成、起動時のモニタリング、ログの記録など、すべての詳細を処理します。あなたがする必要があるのは、オプションを設定して、ファイルで何かを実際に行う詳細をbashスクリプトで処理させるだけです。

+0

これは 'inotify'のラッパーなので、より多くのリソースが必要になります。 –

+1

@putnickコースになります。しかし、他の誰かが私たちのためにデーモンのロジックをすべて詰め込んで、IMHOを実行するのに必要な数メガを上回っています。 –

関連する問題