एक्स विंडो के प्रकट होने / गायब होने की प्रतीक्षा करें (एक सामान्य तरीके से)


11

शेल स्क्रिप्ट के अंदर, मुझे उस विंडो के लिए प्रतीक्षा करने की आवश्यकता होती है, जिसमें उसके शीर्षक पर एक स्ट्रिंग दिखाई देती है, कुछ क्रिया करते हैं, और फिर उसके गायब होने की प्रतीक्षा करते हैं, और कुछ अन्य कार्रवाई करते हैं।

कल तक, मेरे पास यह सरल कोड था। इसके साथ समस्या यह है कि डिस्क को पावर सेविंग स्थिति में नहीं रखा जा सकता है, जबकि स्क्रिप्ट चालू रहती है, और यह कई घंटों के लिए हो सकती है:

while :; do
    until wmctrl -l | grep -q "$string"; do   # until
        sleep 0.5
    done
    : do action 1

    while wmctrl -l | grep -q "$string"; do   # while
        sleep 0.5
    done
    : do action 2
done

चूँकि मैंने तय किया था कि कोड डिस्क पर जोर से जाग्रत हो रहा है, इसलिए मैं कुछ कमांड लाइन टूल्स के प्रलेखन से गुजरा, और खिड़की के गायब होने xdotoolका इंतजार करने और xpropखिड़की के गायब होने का पता लगाने का निर्णय लिया :

while :; do
    # we use `until' because sometimes xdotool just crashes
    until xdotool search -sync -all -onlyvisible -pid $pid -name "$string"; do
        :
    done

    # xdotool isn't trustworthy either, so check again
    wmctrl -l | grep -q "$string" ||
        continue

    : do action 1

    xprop -spy -root _NET_CLIENT_LIST_STACKING | while read line; do
        if [[ ! ${_line:-} || $_line = $line ]]; then
            _line=$line
            continue
        else
            _line=$line
            if wmctrl -l | grep -q "$string"; then
                continue
            else
                : do action 2
                break
            fi
        fi
    done
done

अब मुझे ऊपर कोड के साथ दो नई समस्याएं हैं:

  • xdotoolन केवल क्रैश और अजीब परिणाम देता है, जैसा कि मैंने पहले वर्कअराउंड किया है, लेकिन यह सीपीयू का लगभग 15% चूसता है जबकि खिड़की के सामने आने का इंतजार करता है। तो इसका मतलब है कि मुझे साधारण कोड से छुटकारा मिल गया जो डिस्क को चलाता है, कोड लिखने के लिए जो सीपीयू को घंटों बर्बाद कर रहा है, और मेरा इरादा पहली जगह में बिजली की बचत कर रहा था।
  • xprop -spyहर बार मुझे ध्यान केंद्रित करने (जो मैंने के माध्यम से हल किया है $_line) को बदलने या खिड़कियां बनाने या नष्ट करने के लिए सूचित करेगा । यह डिस्क को xdotool की तुलना में अधिक बार जागता है।

मैं एक साधारण प्रोग्राम की तलाश कर रहा हूं जो सिर्फ खिड़की के शीर्षक $stringया गायब होने की प्रतीक्षा करता है । यह एक मौजूदा कमांड लाइन टूल, एक पायथन स्क्रिप्ट, कंपाइलेबल सी कोड हो सकता है ..., लेकिन मुझे इसे किसी भी तरह से अपनी स्क्रिप्ट में समेटने में सक्षम होना चाहिए (भले ही यह किसी जानकारी को किसी तारीख को लिखता हो)!


1
क्या यह पता लगाने के लिए समझ में नहीं आता है कि आपका पुराना कोड डिस्क को क्यों खोजता है और समाधान खोजता है? कुछ कुछ चिरोट और रामदिस्क की तरह। मुझे लगता है कि strace -f -e trace=file wmctrl -lजानकारीपूर्ण होना चाहिए।
हौके लैजिंग

मैं उपयोग कर रहा हूँ fatraceडिस्क wakeups के लिए जाँच करने के लिए, और यह बताता है मुझे bashपढ़ता है /bin/sleepऔर /usr/bin/wmctrlहर आधे सेकंड, तो इस कारण मैं कुछ प्रोग्राम है जो वास्तव में खिड़की की घटनाओं के लिए इंतजार करेंगे की तलाश में हूँ। क्या मैं कुछ भूल रहा हूँ?
टेरेसा ई जूनियर

1
अगर वे हर दो बार चलाए जाते हैं तो वे डिस्क को नहीं जगाएंगे क्योंकि वे संभवतः कैश हो जाएंगे। क्या आपने अपने फाइल सिस्टम को noatime के साथ माउंट किया था? यह भी देखें btraceसे blktraceडिस्क गतिविधि के स्रोतों की जांच के लिए।
स्टीफन चेज़लस

1
यदि आपने अभी तक इसे नहीं देखा है, तो यह xwininfoउपयोग का हो सकता है, यह निश्चित रूप से wmctrl की तुलना में बहुत कम साझा पुस्तकालयों को लोड करता है और नंगे एक्स के करीब एक स्तर पर संचालित होता है।
msw

1
@msw मैं अक्षम्य को ठीक करने का प्रयास कर रहा हूं, जो Google धरती के लिए एक स्वतः सहेजने की सुविधा है (बंद खट्टी और रिपोर्टिंग कीड़े समय की बर्बादी है)
टेरेसा ई जूनियर

जवाबों:


4

यह आपको सभी को देना चाहिए (ठीक है: सबसे अधिक। मैं क्या भूल गया हूं? सॉकेट?) फ़ाइल सिस्टम गतिविधियां जिसमें लेखन शामिल हैं:

strace -f command 2>&1 | 
  grep -e '^open.*O_CREAT' \
    -e ^write   \
    -e ^mkdir   \
    -e ^rmdir   \
    -e ^unlink  \
    -e ^rename  \
    -e ^chmod   \
    -e ^link    \
    -e ^symlink \
    -e ^mknod

इस जानकारी के साथ कार्यशील वातावरण को tmpfs में बनाया जा सकता है (अंतिम उपाय की क्रिया के रूप में; शायद tmpfs के लिए सहानुभूति पर्याप्त है)। यदि प्रोग्राम को रैम चेरोट में शुरू किया जाता है, तो सीधे डिस्क को जगाने का मौका नहीं होता है। इसकी फ़ाइल सिस्टम पदानुक्रम के लिए कोई भी लेखन कभी भी डिस्क पर नहीं लिखा जाता है।


मेरा मानना ​​है कि किसी फ़ाइल को पढ़ते समय, कम से कम पहली बार, डिस्क को भी जगा देंगे, है ना? मैं सोच रहा था कि क्या blktraceइसके लिए सही उपकरण होगा, लेकिन इसके लिए एक कर्नेल संकलन की आवश्यकता होगी # CONFIG_BLK_DEV_IO_TRACE is not set:( यह इस प्रश्न के दायरे से परे है, हालांकि। धन्यवाद!
टेरेसा ई जूनियर

1
@TeresaeJunior ज़रूर लेकिन कौन इस समस्या पर विचार करेगा? यह स्क्रिप्ट को हर समय चालू रखने के बारे में है न कि इसे शुरू करने के बारे में। और आप से tmpfs बना सकते हैं boot.local/ rc.localताकि आपके पास बाद में स्क्रिप्ट शुरू करने पर भी डिस्क एक्सेस न हो। मुझे बस एक नज़र थी blktrace(पहले यह नहीं पता था)। यह बहुत भयानक है, मुझे आश्चर्य है कि अगर मुझे आज रात नींद आ जाएगी ...
हौके लाजिंग

हां, मुझे अब इस बारे में चिंता नहीं करनी चाहिए, आप फिर से सही हैं। लेकिन मुझे लगता है कि मैं कर्नेल को संकलित करते हुए नींद की इस रात को भी ढीला कर दूंगा, क्योंकि मैं चाहता हूं कि वह सब कुछ जांचना चाहता हूं जो लगातार डिस्क को जागृत कर सकता है, न केवल यह विशेष रूप से Google धरती हैक :)
टेरेसा ई जूनियर

6

यह "वास्तविक" X11 एप्लिकेशन लिखकर इसे संभालने के लिए अपने विंडो मैनेजर या X11 पर निर्भर होना आसान और अधिक विश्वसनीय हो सकता है।

शेल से आप जो चाहते हैं वह कुछ ऐसा है जो विंडो मैनेजर के साथ रजिस्टर होता है और शेल में लौटने से पहले वांछित ईवेंट प्रकार का इंतजार करता है ... यह बहुत अधिक लोड-फ्रेंडली है यदि आप शेल के अंदर लूपिंग से बच सकते हैं। (आपके until xdotool...लोड का कारण बनता है क्योंकि लूप के अंदर कोई देरी (नींद) नहीं है।)

आह ... जाहिरा तौर xdotoolपर उस सुविधा को साल भर पहले जोड़ा गया था --sync। यह मेरे वर्तमान लिनक्स डिस्ट्रो (डेबियन स्क्वीज़) में उपलब्ध नहीं है, इसलिए मैंने इसे आज़माया नहीं है।

आप के लिए इसी तरह के सवाल का जवाब देने वाला xdotool डेवलपर: https://groups.google.com/d/msg/xdotool-users/7zfKTtyWm0Q/DM6TSOBUWZMJ


हां, वास्तव में, -syncमैं जो चाहता था , वह करना था, लेकिन इसकी आवश्यकता है whileक्योंकि यह अंततः खिड़की के प्रकट होने से पहले दुर्घटनाग्रस्त हो जाएगा, और बहुत अधिक सीपीयू बर्बाद कर देगा। मैं वास्तव में xdotoolस्रोत से संकलित हुआ क्योंकि डेबियन से एक टाइप करने के लिए अविश्वसनीय रूप से धीमा था। एक्स के साथ सीधे इंटरैक्ट करने वाला एप्लिकेशन लिखना वास्तव में मेरे से परे है। हालांकि धन्यवाद!
टेरेसा ई जूनियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.