2013-02-04 73 views
8

我正在尋找一個小的bash腳本,以便在啓動時監視任何新創建文件的目錄。如果出現新文件,我希望它的存在觸發第二個腳本運行。在創建文件時執行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 

有沒有更簡單/清潔/更少的內存密集型的方式做到這一點?

編輯我將更改每個捕獲會話的提取目錄。我已經調整了代碼相應

+2

請注意。該腳本可以在應用程序完成寫入文件之前運行,並且會壓縮不完整的文件。 – Barmar

回答

11

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>是在事件發生時應該運行的命令。以下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 menu.lst文件中添加以下行:

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

這看起來像一個很好的解決方案,但我會改變每個攝入會話的目錄。編輯每個會話兩次incron表會更有效嗎?或者使用一個解決方案作爲一個進程運行並在之後死亡? – Simianspaceman

+0

我有一些問題添加條目到incrontab。它告訴我的用戶和root用戶「不能使用incrontab」 – Simianspaceman

+1

創建文件/etc/incron.allow(在etc/incron.conf中檢查,如果這是允許用戶的正確文件),並添加root和你的用戶 – Satish

0

你可以用神奇inotify工具做到這一點:

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

這種方法具有很大的優勢,避免輪詢每隔N秒。

的inotify(inode的通知)是可以充當來擴展文件系統 注意更改文件系統,並且報告這些 更改應用的Linux內核子系統。它取代了一個早期的設備,dnotify, 其目標相似。

http://en.wikipedia.org/wiki/Inotify
inotify doc

1

使用iwatch。不完全是。它將處理製作守護進程的所有細節,啓動時運行,監視和記錄,等等。所有你需要做的就是設置選項,並讓你的bash腳本處理實際上對文件做些什麼的細節。

+0

它是'inotify'的包裝,所以需要更多的資源。 –

+1

@sputnick當然會。但是讓其他人爲我們包裝所有守護進程的邏輯遠遠超過運行這個東西所需的幾個megs,恕我直言。 –