2012-06-08 8 views
10

मेरे पास मेरे लिनक्स बॉक्स पर छवियों का नाम फ़ोल्डर है। यह फ़ोल्डर किसी वेबसाइट से जुड़ा हुआ है और साइट के व्यवस्थापक के पास इस साइट पर चित्र जोड़ने की क्षमता है। हालांकि, जब कोई चित्र जोड़ा जाता है, तो मैं सभी चित्रों को एक निर्देशिका को आकार देने के लिए एक आदेश चाहता हूं।फ़ाइल जोड़ने पर शेल कमांड चलाएं

संक्षेप में, मैं जानना चाहता हूं कि जब कोई विशिष्ट फ़ाइल किसी नई फ़ाइल में जोड़ा जाता है तो मैं सर्वर को एक विशिष्ट कमांड कैसे चला सकता हूं।

+0

http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –

उत्तर

22

मुझे नहीं पता कि लोग इस फ़ोल्डर में सामग्री कैसे अपलोड कर रहे हैं, लेकिन आप इनोटिफ़ाई के साथ निर्देशिका की निगरानी करने से कम तकनीक का उपयोग करना चाहेंगे।

यदि प्रोटोकॉल एफ़टीपी है और आपके पास अपने एफ़टीपी सर्वर के लॉग तक पहुंच है, तो मैं सुझाव देता हूं कि सफल अपलोड के लिए लॉग इन करने के लिए लॉग इन करें। इस प्रकार का इवेंट-ट्रिगर दृष्टिकोण पारंपरिक क्रॉन के साथ मतदान दृष्टिकोण से तेज़, अधिक भरोसेमंद और कम भार होगा, और अधिक पोर्टेबल और इनोटिफ़ाई का उपयोग करके कुछ डीबग करना आसान होगा।

जिस तरह से आप इसे संभालेंगे वह निश्चित रूप से आपके एफ़टीपी सर्वर पर निर्भर करेगा। मैं एक चल vsftpd जिसका लॉग शामिल लाइनों इस तरह है:

Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16" 
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec 
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644" 

UPLOAD लाइन केवल जोड़ा जाता है vsftpd सफलतापूर्वक फ़ाइल को बचाया है। आप इस प्रकार का खोल स्क्रिप्ट में इस पार्स सकता है:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo "$line" | cut -d, -f2) 
    if [ -s "$filename" ]; then 
     # do something with $filename 
    fi 
    fi 
done 

आप एक HTTP अपलोड टूल का उपयोग कर रहे हैं, अगर उस उपकरण यह आने वाले फ़ाइलें रिकॉर्ड करने के लिए उपयोग करता है एक पाठ लॉग फ़ाइल है देखते हैं। यदि यह किसी प्रकार के लॉगर फ़ंक्शन को जोड़ने पर विचार नहीं करता है, तो यह tail पर लॉग उत्पन्न करेगा।

+0

यह एकदम सही है। मैं वास्तव में एक PHP/एचटीएमएल अपलोड बटन का उपयोग कर रहा हूँ। लेकिन मैं अपलोड पेज के लिए अपाचे से एक्सेस फ़ाइल स्कैन कर सकता हूं। – Cripto

+1

जो मैं यहां नहीं देखता वह वह है जो आप लॉग फ़ाइल को ट्रिगर करने वाली स्क्रिप्ट को ट्रिगर करने के लिए कर रहे हैं। –

+1

@ जेसनग्रे, क्या आप 'पूंछ' के 'एफएफ' विकल्प से परिचित हैं? ['आदमी पूंछ '] (http://www.freebsd.org/cgi/man.cgi?query=tail) विवरण के लिए। '-F' फ़ाइल को बढ़ने तक 'पूंछ' का इंतजार करने का कारण बनता है, फिर इसे stdout पर भेजें। तो

'do something'
भाग के लिए "ट्रिगर" बस फ़ाइल में नई सामग्री का जोड़ है। यह स्क्रिप्ट स्टार्टअप पर शायद एक बार चलती है, और चलती रहती है। आप इसे कैसे लॉन्च करते हैं, यह आपके ऊपर है, और आपके ऑपरेटिंग सिस्टम या डिस्ट्रो पर निर्भर करता है। – ghoti

3

आप inotify

inotify एपीआई को देखने के लिए चाहते हो सकता है निगरानी फाइल सिस्टम की घटनाओं के लिए एक तंत्र प्रदान करता है। व्यक्तिगत फ़ाइलों की निगरानी करने के लिए, या निर्देशिकाओं की निगरानी के लिए इनोटिफ़ाई का उपयोग किया जा सकता है। जब किसी निर्देशिका की निगरानी की जाती है, तो inotify निर्देशिका के लिए घटनाओं को वापस कर देगा, और निर्देशिका के अंदर फ़ाइलों के लिए।

4

की तरह जॉन टिप्पणी की inotify एपीआई एक प्रारंभिक बिंदु है, फिर भी आप कुछ उपकरण है कि इस API का उपयोग फ़ाइल अधिसूचना कार्य करने में रुचि हो सकती:

उदाहरण incron जो cron- को चलाने के लिए इस्तेमाल किया जा सकता के लिए फ़ाइल या निर्देशिका परिवर्तनों का पता चला है जब कार्यों की तरह।

या inotify-tools जो कमांड लाइन उपकरण का एक सेट है जिसका उपयोग आप अपनी फ़ाइल अधिसूचना खोल स्क्रिप्ट बनाने के लिए कर सकते हैं।

आप inotify-उपकरणों के लिए विकी pake के तल पर देखें, तो आप संदर्भ के लिए और भी उपकरण और अजगर, पर्ल या Ruby (example code) की तरह उच्च स्तरीय भाषाओं के लिए समर्थन देखेंगे।

0

का उपयोग ghotis काम

यहाँ मैं उन खाली स्थान प्राप्त करने के लिए किया था: फ़ाइल एक HTTP अपलोड के माध्यम से जोड़ा जाता है

#!/bin/bash 

tail -F -n 1 /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK LOGIN:'; then 
    pid=$(sed 's/.*\[\([^]]*\)\].*/\1/g' <<< "$line") 
    #the operator '<<<' doesnt exist in dash so use bash 
    if [[ $pid != *"pid"* ]]; then 
     echo -e "Disk 1: Contains Games:\n" > /home/vftp/"$pid"/FreeSpace.txt; df -h /media/Disk1/ >> /home/vftp/"$pid"/FreeSpace.txt 
     echo -e "\r\n\r\nIn order to read this properly you need to use a text editor that can read *nix format files" >> /home/vftp/"$pid"/FreeSpace.txt 
    fi 
echo "checked" 
# awk '{ sub("\r$", ""); print }' /home/vftp/"$pid"/FreeSpace.txt > /home/vftp/"$pid"/FreeSpace.txt 
    fi 
done 
0

, और यदि आपके सर्वर अपाचे है, तो आप चाहते हो सकता है mod_security की जांच करने के लिए।

यह आपको HTTP पोस्ट के माध्यम से किए गए प्रत्येक अपलोड के लिए एक स्क्रिप्ट चलाने में सक्षम बनाता है।

0
#!/bin/bash 

tail -F -n0 /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo $line | cut -d, -f2 |awk '{print $1}') 
    filename="${filename%\"}" 
    filename="${filename#\"}" 
    #sleep 1s 
    if [ -s $filename ]; then 
     # do something with $filename 
     echo $filename 
    fi 
    fi 
done