2013-02-04 38 views
8

Tôi đang tìm cách viết một tập lệnh bash nhỏ, khi được khởi chạy, xem một thư mục cho bất kỳ tệp mới được tạo nào. Nếu một tập tin mới xuất hiện, tôi muốn sự hiện diện của nó để kích hoạt một tập lệnh thứ hai để chạy.Thực hiện một tập lệnh bash khi tạo tập tin

Tôi thấy điều này đang được sử dụng để kích hoạt nén video được số hóa gần đây và thêm video đó vào nhật ký cảnh quay đã nhập.

Hiện nay mã của tôi trông như thế này:

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

Có một dễ dàng hơn/sạch hơn/ít bộ nhớ cách chuyên sâu để làm điều này?

EDIT Tôi sẽ thay đổi thư mục nhập mỗi phiên chụp. Tôi đã điều chỉnh mã phù hợp

+2

Hãy cẩn thận. Kịch bản có thể chạy trước khi ứng dụng hoàn thành việc ghi tệp, và nó sẽ nén một tệp không đầy đủ. – Barmar

Trả lời

11

Làm thế nào về incron? Nó kích hoạt lệnh trên các thay đổi tệp/thư mục.

sudo apt-get install incron 

Ví dụ:

<path> <mask> <command> 

đâu <path> có thể là một thư mục (có nghĩa là thư mục và/hoặc các tập tin trực tiếp trong thư mục đó (không phải tập tin trong thư mục con của thư mục đó) đều được theo dõi!) Hoặc một tập tin.

<mask> có thể là một trong những cách sau:

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> là lệnh cần được chạy khi sự kiện xảy ra. Bạn có thể sử dụng các wildards sau trong đặc tả lệnh:

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

Nếu bạn xem thư mục, sau đó $ @ giữ đường dẫn thư mục và $ # tệp kích hoạt sự kiện. Nếu bạn xem tệp, thì $ @ giữ đường dẫn đầy đủ đến tệp và $ # trống.

làm việc Ví dụ:

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

Bắt đầu Daemon:

$sudo /etc/init.d/incrond start 

Sửa incrontab tập tin

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

thử nghiệm nó

$touch /home/spatel/alpha 

Kết quả:

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

Ghi chú: Trong Ubuntu bạn cần phải kích hoạt inotify vào lúc khởi động. Vui lòng thêm dòng sau vào tệp trình đơn Grub.lst:

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

Điều này có vẻ như một giải pháp tốt, mặc dù tôi sẽ thay đổi thư mục mỗi phiên nhập. Nó sẽ hiệu quả hơn để chỉnh sửa các bảng incron hai lần mỗi phiên, hoặc sử dụng một giải pháp chạy như một quá trình và chết sau đó? – Simianspaceman

+0

Tôi đang gặp một số Sự cố khi thêm mục nhập vào incrontab. Nó cho tôi biết cả người dùng và root của tôi "không thể sử dụng incrontab" – Simianspaceman

+1

Tạo tập tin /etc/incron.allow (kiểm tra trong etc/incron.conf nếu đó là tập tin phù hợp để cho phép người dùng), và thêm root và người dùng của bạn – Satish

0

Bạn có thể làm điều này với công cụ kỳ diệu inotify:

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

Phương pháp này có lợi thế lớn để tránh bỏ phiếu mỗi N giây.

inotify (inode thông báo) là một hệ thống phụ kernel Linux đóng vai trò mở rộng hệ thống tập tin để nhận thấy những thay đổi trong hệ thống tập tin, và báo cáo những thay đổi các ứng dụng. Nó thay thế một cơ sở trước đó, dnotify, có mục tiêu tương tự.

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

1

Sử dụng iwatch. Không, thực sự. Nó sẽ xử lý tất cả các chi tiết của việc tạo ra một daemon, chạy khi khởi động, theo dõi và đăng nhập, vân vân vân vân. Tất cả bạn cần làm là thiết lập các tùy chọn, và có kịch bản bash của bạn xử lý các chi tiết thực sự làm một cái gì đó với các tập tin.

+0

Đó là một trình bao bọc trên 'inotify', vì vậy nó sẽ mất nhiều tài nguyên hơn. –

+1

@sputnick tất nhiên nó sẽ. Nhưng có ai đó kết hợp tất cả logic daemon đó cho chúng ta nhiều hơn so với vài meg cần thiết để điều hành, IMHO. –

Các vấn đề liên quan