कैसे, एक स्क्रिप्ट में, क्या मैं यह निर्धारित कर सकता हूं कि क्या एक फाइल वर्तमान में किसी अन्य प्रक्रिया द्वारा लिखी जा रही है?


21

मैं स्क्रिप्टिंग को कोसने के लिए बहुत नया हूं, इसलिए मैं गलत पेड़ को भौंक सकता हूं, लेकिन यहां मेरी वर्तमान स्थिति है:

एक स्क्रिप्ट में, मैं सॉफिस शुरू करता हूं ; एक ओआरटी को एक पीडीएफ में बदलने के लिए

ऐसा लगता है कि स्क्रिप्ट की प्रक्रिया से सॉफिस खुद को अलग कर लेता है, और अपना काम करने के लिए भटक जाता है .. ठीक है, यह ठीक है; GUI ऐप्स ऐसा करते हैं ...

हालाँकि मुझे तब तक इंतजार करना होगा जब तक कि नया पीडीएफ पूरी तरह से लिखा नहीं गया है, क्योंकि मेरे अगले कदम में उस नए पीडीएफ को संसाधित करना शामिल है ।

(जहां तक ​​मुझे पता है) मैं सॉफिस की प्रक्रिया-आईडी का उपयोग नहीं कर सकता, क्योंकि यह मेरी स्क्रिप्ट शुरू होने से पहले ही चल रही प्रक्रिया हो सकती है, जैसे। किसी अन्य असंबद्ध दस्तावेज / प्रस्तुति / स्प्रेडशीट के लिए सामान्य जीयूआई गतिविधि के लिए सॉफिस पहले से ही खुला हो सकता है।

मेरे लिए इस मामले की जड़ यह है कि इससे पहले कि मैं आगे बढ़ूं, नए पीडीएफ के लेखन को अंतिम रूप दिया जाना चाहिए ...

क्या यह निर्धारित करने का कोई तरीका है कि कोई फ़ाइल "लेखन" मोड में किसी अन्य प्रक्रिया के लिए खुली नहीं है? ...

जवाबों:


25

आप यह lsof | grep /absolute/path/to/file.txtदेखने के लिए उपयोग कर सकते हैं कि कोई फ़ाइल खुली है या नहीं। यदि फ़ाइल खुली है, तो यह कमांड 0 स्थिति लौटाएगा, अन्यथा यह 256 (1) वापस आ जाएगा।

विदित हो कि यह कमांड एक सेकेंड का समय लेगी, क्योंकि आम तौर पर, किसी भी समय बहुत सारी फाइलें खुलती हैं।

आप lsof -c geditउदाहरण के लिए, यह भी देख सकते हैं कि किस फ़ाइल में gedit खोला गया है। एक प्रक्रिया में आउटपुट को प्रतिबंधित करने से निष्पादन का समय व्यावहारिक रूप से शून्य हो जाएगा।

यहाँ प्रतीक्षा करने के लिए एक स्क्रिप्ट है:

#!/bin/bash

while :
do
    if ! [[ `lsof -c python3.2 | grep test.py` ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"

यह चलता है जबकि एक प्रक्रिया 'pyhton3.2' को फ़ाइल 'test.py' मिल गई है। जैसे ही फ़ाइल बंद होती है, यह 'इको किया' पर निकल जाता है और बाहर निकल जाता है।

मैंने 'स्लीप 0.5' को वहां रखा है ताकि लूप सीपीयू को बुरी तरह से हॉग न करे। अन्यथा, यह 100% सीपीयू का उपयोग करेगा।

बोनस वहाँ एक आसान तरीका लगता है pdf को odt प्रदान करता है:

इस सुंदर टिप के लिए OOo फोरम पर scls19fr का धन्यवाद। आप OpenOffice Writer फाइलों को कमांड लाइन से पीडीएफ में कनवर्ट कर सकते हैं unoconv -f pdf input.odt, Unoconv का उपयोग करने के लिए, बस sudo apt-get install unoconvटर्मिनल पर चलाएं । (rhyshale.wordpress.com की rhyshale)


इसे एक लूप में लपेटें और आपको एक सौदा मिल गया है।
निक पास्कुची

हो गया। :-) मुझे आशा है कि यह भयानक शैली नहीं है - सर्वोत्तम प्रथाओं पर पढ़ने की जहमत नहीं उठाई गई है। यह वैसे भी अच्छा काम करता है।
Stefano Palazzo

धन्यवाद स्टेफानो ... हाँ, यह काम करता है ... तो यह एक अच्छा और सही उत्तर है .. एक तरफ ध्यान दें, इस पर प्रकाश डाला गया है कि सॉफिस में क्या हो रहा है जैसा कि मैंने सोचा नहीं था .. ऐसा लगता है कि एक अस्थायी फ़ाइल बनाया जा रहा है और अंतिम फ़ाइल (शायद / शायद) पूरा होने पर नाम बदल दिया गया है ... इसलिए मैं अब उस पर गौर कर रहा हूं ... जिस स्थिति में, मुझे इसके * अस्तित्व की प्रतीक्षा करने की आवश्यकता हो सकती है ... ... और unoconv पर लिंक के लिए धन्यवाद .. मैं इसे देखूंगा .. (कुल मिलाकर, मैं .pdf को एकाधिक ..jpegs प्रति पृष्ठ एक)
पीटर.नव।

@ fred.bear जब तक कोई फ़ाइल मौजूद है, तब तक प्रतीक्षा करें, यदि इस के साथ स्टेटमेंट को प्रतिस्थापित करें if [ -f test.odf ]:। (bash स्क्रिप्ट इतनी गुप्त कभी कभी हो सकता है ...)
Stefano Palazzo

6
lsof -- /path/to/fileइसके बजाय grep'आईएनजी
RubyTuesdayDONO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.