簡體   English   中英

在創建文件時執行 bash 腳本

[英]Executing a bash script upon file creation

我正在尋找編寫一個小的 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

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

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

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。 請在 Grub menu.lst 文件中添加以下行:

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

你可以用神奇的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/Inotify
請參閱inotify 文檔

使用iwatch 不完全是。 它將處理制作守護進程、啟動時運行、監控和日志等的所有細節。 您需要做的就是設置選項,並讓您的 bash 腳本處理實際對文件執行某些操作的細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM