2017-09-29 14 views
6

को docx परिवर्तित मैं inotifwait साथ खोल स्क्रिप्ट के तहत रूप में सेट अप:inotifywait ईवेंट सक्रिय दो बार जबकि पीडीएफ

inotifywait -r -e close_write,moved_to -m "<path>/upload" --format '%f##@@##%e##@@##%w' 

कुछ docx देखा निर्देशिका में रहने वाले फ़ाइल नहीं है और कुछ स्क्रिप्ट आदेश नीचे के माध्यम से पीडीएफ के लिए docx धर्मान्तरित:

soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir <path>/upload/ 

पीडीएफ उत्पन्न होने के तुरंत बाद किसी भी तरह की घटना दो बार ट्रिगर हो जाती है। प्रविष्टियां निम्नानुसार हैं:

somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/ 
somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/ 

और क्या गलत है?

सादर

+0

मैंने स्ट्रेस परिणाम पर एक नज़र डाली है, दोनों soffice.bin से 'करीबी', पहले एक temp पीडीएफ परिणाम फ़ाइल को गंतव्य पर कॉपी करना है, दूसरा सिर्फ अपने आंकड़ों की जांच कर रहा है, जावा स्रोत में गहराई से खोदना है। लेकिन यह आपको परेशान क्यों करता है? आपकी प्रतिक्रिया के लिए – georgexsh

+0

धन्यवाद @georgexsh। दरअसल कुछ कॉपी-टू-क्लाउड कार्यक्षमता चल रही है जिस पर इस ट्रिगर के साथ बाध्य है। तो फाइलें दो बार कॉपी की गई हैं और कुछ अन्य घरों को समानांतर में चल रही नौकरियां चल रही हैं। –

+0

@JatinDhoot आप किस तरह का जवाब खोज रहे हैं? – ffeast

उत्तर

1

यह दो बार शुरू हो रहा है, क्योंकि यह कैसे soffice आंतरिक रूप से व्यवहार करने के लिए प्रकट होता है के लिए किया गया था। एक दिन यह 10 बार लिखना शुरू कर सकता है और एक ही रन के दौरान ऐसे लिखने के बीच sleep 2 कर रहा है, हमारा प्रोग्राम नहीं कर सकता है और मुझे विश्वास है कि इसे अनुमानित नहीं करना चाहिए और उस पर निर्भर नहीं होना चाहिए।

तो मैं एक अलग कोण से समस्या को हल करने की कोशिश करता हूँ - बस एक अस्थायी निर्देशिका में बदली गई फ़ाइल रखा और फिर लक्ष्य dir पर ले जाते हैं, इस तरह की सुविधा देता है:

soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir <path>/tempdir/ && mv <path>/tempdir/somedoc.pdf <path>/upload/

और उपयोग निम्नलिखित तरीके से inotifywait:

inotifywait -r -e moved_to -m "<path>/upload" --format '%f##@@##%e##@@##%w' 

लाभ यह है कि तुम अब soffice के आंतरिक तर्क पर निर्भर है। यदि आप पीडीएफ फाइलों का उत्पादन करने वाली स्क्रिप्ट के व्यवहार को समायोजित नहीं कर सकते हैं तो वास्तव में आपको @Tarun सुझाए गए वर्कअराउंड का सहारा लेना होगा।

+0

धन्यवाद, यह काम किया। सम्मान के साथ सम्मानित बाउंटी। –

1

मुझे नहीं लगता कि आप इस तरह के रूप में बाहरी कार्यक्रम को नियंत्रित कर सकते हैं। लेकिन मुझे लगता है कि आप इस आउटपुट का उपयोग पाइप के लिए कर रहे हैं और फिर इसे किसी और जगह इनपुट कर रहे हैं। उस मामले में आप एक घटना है कि कुछ सेकंड के

के अंतराल के साथ लगातार होता है से बच सकते हैं तो हम --format और --timefmt "%s" को %T जोड़ने युग समय मिलता है। नीचे अद्यतन आदेश

$ inotifywait -r -e close_write,moved_to --timefmt "%s" -m "/home/vagrant" --format '%f##@@##%e##@@##%w##T%T' -q | ./process.sh 
test.txt##@@##CLOSE_WRITE,CLOSE##@@##/home/vagrant/ 
Skipping this event as it happend within 2 seconds. TimeDiff=2 
test.txt##@@##CLOSE_WRITE,CLOSE##@@##/home/vagrant/ 

यह touch test.txt, कई समय हर दूसरे का उपयोग करके किया गया था। और जैसा कि आप दूसरा देख सकते हैं भी छोड़ दिया गया था। process.sh एक सरल बैश स्क्रिप्ट

#!/bin/bash 

LAST_EVENT= 
LAST_EVENT_TIME=0 
while read line 
do 
    DEL="##T" 
    EVENT_TIME=$(echo "$line" | awk -v delimeter="$DEL" '{split($0,a,delimeter)} END{print a[2]}') 
    EVENT=$(echo "$line" | awk -v delimeter="$DEL" '{split($0,a,delimeter)} END{print a[1]}') 
    TIME_DIFF=$(($EVENT_TIME - $LAST_EVENT_TIME)) 
    if [[ "$EVENT" == "$LAST_EVENT" ]]; then 
    if [[ $TIME_DIFF -gt 2 ]]; then 
     echo "$EVENT" 
    else 
     echo "Skipping this event as it happend within 2 seconds. TimeDiff=$TIME_DIFF" 
    fi 
    else 
    echo $EVENT 
    LAST_EVENT_TIME=$EVENT_TIME 
    fi 
    LAST_EVENT=$EVENT 
done < "${1:-/dev/stdin}" 

अपने वास्तविक स्क्रिप्ट में आप echo अगर में निष्क्रिय कर देगा है, यह एक बस डेमो उद्देश्य

+0

आपके प्रयासों के लिए धन्यवाद तरुण। मैं इसे आज़मा दूंगा और आपको बता दूंगा। धन्यवाद –

संबंधित मुद्दे