12

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

これは、最近デジタル化されたビデオの圧縮をトリガーし、取り込んだフッテージのログに追加するために使用されていることがわかります。

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

#!/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

これを行うためのより簡単/クリーン/メモリ消費の少ない方法はありますか?

編集キャプチャセッションごとに取り込みディレクトリを変更します。それに応じてコードを調整しました

4

3 に答える 3

18

incronはどうですか?ファイル/ディレクトリの変更時にコマンドをトリガーします。

sudo apt-get install incron

例:

<path> <mask> <command>

<path>ディレクトリ(ディレクトリおよび/またはそのディレクトリに直接あるファイル(そのディレクトリのサブディレクトリにあるファイルではありません!)が監視されることを意味します)またはファイルはどこにありますか。

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

$$   dollar sign
$@   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をアクティブ化する必要があります。Grubmenu.lstファイルに次の行を追加してください。

kernel /boot/vmlinuz-2.6.26-1-686 root=/dev/sda1 ro inotify=yes
于 2013-02-04T17:56:04.770 に答える
6

あなたは魔法のinotifyツールでこれを行うことができます:

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

この方法には、N秒ごとのポーリングを回避するという大きな利点があります。

Inotify(inode notify)は、ファイルシステムを拡張してファイルシステムの変更を通知し、それらの変更をアプリケーションに報告するように機能するLinuxカーネルサブシステムです。これは、同様の目標を持っていた以前の施設であるdnotifyに代わるものです。

http://en.wikipedia.org/wiki/Inotifyinotifyドキュメント
を参照してください

于 2013-02-04T17:48:32.970 に答える
1

iwatchを使用します。いいえ、本当に。デーモンの作成、起動時の実行、監視とログ記録などのすべての詳細を処理します。オプションを設定し、bashスクリプトにファイルで実際に何かを行う詳細を処理させるだけです。

于 2013-02-04T17:52:32.350 に答える