[英]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。
使用iwatch 。 不完全是。 它將處理制作守護進程、啟動時運行、監控和日志等的所有細節。 您需要做的就是設置選項,並讓您的 bash 腳本處理實際對文件執行某些操作的細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.