2013-02-04 23 views
8

पर एक बैश स्क्रिप्ट निष्पादित करना मैं लॉन्च होने पर, एक छोटी बैश स्क्रिप्ट लिख रहा हूं, किसी भी नई बनाई गई फ़ाइलों के लिए निर्देशिका देखें। यदि कोई नई फ़ाइल दिखाई देती है, तो मैं अपनी उपस्थिति को चलाने के लिए दूसरी स्क्रिप्ट को ट्रिगर करना चाहता हूं।फ़ाइल निर्माण

मुझे लगता है कि यह हाल ही में डिजिटलीकृत वीडियो संपीड़न को ट्रिगर करने के लिए उपयोग किया जा रहा है, और इसे इंजेस्टेड फुटेज के लॉग में जोड़ें।

वर्तमान में मेरे कोड इस तरह दिखता है:

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

प्रारंभ Daemon:

$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

यह एक अच्छा समाधान की तरह लगता है, हालांकि मैं प्रति इंजेक्शन सत्र में निर्देशिका बदल रहा हूं। क्या प्रति सत्र दो बार इंक्रॉन टेबल को संपादित करना अधिक कुशल होगा, या एक समाधान के रूप में चलने वाले समाधान का उपयोग करें और बाद में मर जाएगा? – Simianspaceman

+0

मुझे कुछ समस्याएं हैं जो incrontab में प्रविष्टियां जोड़ रही हैं। यह मुझे मेरे उपयोगकर्ता और रूट दोनों को बताता है "incrontab का उपयोग नहीं कर सकता" – Simianspaceman

+1

फ़ाइल /etc/incron.allow फ़ाइल (etc/incron.conf में चेक करें यदि यह उपयोगकर्ताओं को अनुमति देने के लिए सही फ़ाइल है), और रूट जोड़ें और आपका उपयोगकर्ता – Satish

0

आप जादुई inotify उपकरण के साथ ऐसा कर सकते हैं:

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

इस विधि बड़ा लाभ मतदान हर एन सेकंड से बचने के लिए किया है।

Inotify (inode सूचित) एक लिनक्स कर्नेल उपतंत्र फ़ाइल सिस्टम का विस्तार फाइल सिस्टम में परिवर्तन दिखने के लिए, और आवेदन करने के लिए उन परिवर्तनों की रिपोर्ट करने में कार्य करता है। यह पहले की सुविधा को बदलता है, dnotify, जिसमें समान लक्ष्य थे।

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

1

उपयोग iwatch देखें। सच में नहीं। यह एक डिमन बनाने, स्टार्टअप, मॉनीटर और लॉग पर चलने के सभी विवरणों को संभालेगा, इसी तरह और इसी तरह। आपको बस इतना करना है कि विकल्प सेट करें, और अपनी बैश स्क्रिप्ट वास्तव में फ़ाइल के साथ कुछ करने के विवरण को संभाल लें।

+0

यह 'inotify' पर एक रैपर है, इसलिए इसमें अधिक संसाधन होंगे। –

+1

@sputnick कोर्स यह होगा। लेकिन किसी और को हमारे लिए उस सभी डेमॉन तर्क को लपेटने के लिए चीज चलाने के लिए आवश्यक कुछ मेग्स से कहीं अधिक है, आईएमएचओ। –