हर 10 सेकंड में लॉन्च प्रोग्राम को अधिक बार लॉन्च कर सकते हैं?


8

मेरे पास इस तरह की कुछ सेवाएं हैं जिन्हें मैं फ़ाइलों को संशोधित करने के तुरंत बाद चलाना चाहता हूं।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>     
        <string>say</string>
        <string>a</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/username/Desktop/</string>
    </array>
</dict>
</plist>

यहां तक ​​कि अगर थ्रोटलइंटरवल को 1 या 0 पर सेट किया गया था, तो वे केवल प्रत्येक 10 सेकंड में चलाया जाता है।

9/9/12 4:57:05.457 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 7 seconds
9/9/12 4:57:09.541 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 3 seconds

man launchd.plist केवल यह कहता है कि प्रोग्राम्स डिफ़ॉल्ट रूप से प्रत्येक 10 सेकंड से अधिक नहीं चलते हैं, लेकिन यह उल्लेख नहीं करता है कि थ्रॉटलइंटरवल इसके नीचे सेट नहीं किया जा सकता है।

ThrottleInterval <integer>
This key lets one override the default throttling policy imposed on jobs by launchd.
The value is in seconds, and by default, jobs will not be spawned more than once
every 10 seconds.  The principle behind this is that jobs should linger around just
in case they are needed again in the near future. This not only reduces the latency
of responses, but it encourages developers to amortize the cost of program invoca-
tion.

आप कार्यक्रम या स्क्रिप्ट को 10 सेकंड के लिए चालू रख सकते हैं और हर दूसरे बदलाव के लिए देख सकते हैं:

#!/bin/bash

start=$(date +%s)
prev=

until (( $(date +%s) >= $start + 10 )); do
    new=$(stat -f %m ~/Desktop/)
    [[ $prev != $new ]] && say a
    prev=$new
    sleep 1
done

या रूबी में ही:

#!/usr/bin/env ruby

start = Time.now
prev = nil

until Time.now >= start + 10
  current = File.mtime("#{ENV['HOME']}/Desktop/")
  `say a` if current != prev
  prev = current
  sleep 1
end

लेकिन क्या समय सीमा को बाईपास या कम करने का कोई तरीका है? यह फ़ोल्डर क्रियाओं पर भी लागू होता है।

जवाबों:


9

समय सीमा को बाईपास या कम करने का कोई तरीका नहीं है।

लॉन्चिंग जॉब्स बनाने के बारे में Apple का प्रलेखन निम्नलिखित बताता है:

महत्वपूर्ण यदि आपका डेमॉन लॉन्च होने के बाद बहुत तेज़ी से नीचे गिरता है, तो लॉन्चड सोच सकता है कि यह दुर्घटनाग्रस्त हो गया है। इस व्यवहार को जारी रखने वाले डेमन को निलंबित किया जा सकता है और भविष्य के अनुरोध आने पर दोबारा लॉन्च नहीं किया जा सकता है। इस व्यवहार से बचने के लिए, लॉन्च के बाद कम से कम 10 सेकंड के लिए बंद न करें।

आपके कार्यक्रम या स्क्रिप्ट को कम से कम 10 सेकंड तक चालू रखने की आवश्यकता है। अंतिम दस सेकंड में फ़ाइल संशोधन तिथियों की जांच के लिए एक लूप को लागू करने पर विचार करें, दस सेकंड के लिए सो रहा है, और दोहरा रहा है।

वैकल्पिक रूप से, आप kqueue या FSEvents API का उपयोग करके विशिष्ट फ़ाइलों को देख सकते हैं। यह StackOverflow प्रश्न मददगार हो सकता है, मैक ओएस एक्स में फाइल-स्तरीय फाइल सिस्टम परिवर्तन अधिसूचना


2

जब आप यह कर लें तो अपनी स्क्रिप्ट को संशोधित फाइलों के लिए लूप चेकिंग में रख सकते हैं। संशोधित फ़ाइलों की जाँच के बाद इसे कुछ सेकंड के लिए सोएँ। यदि यह संशोधित फ़ाइलें पाता है, तो स्क्रिप्ट के साथ जारी रखें। यदि नहीं, तो फिर से सो जाओ।

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


अगर पिछले एक अभी भी चल रहा है, तो लॉन्चड दूसरा उदाहरण शुरू नहीं करता है।
Lri

लॉन्चड एक ही नौकरी के टिकट के कई उदाहरण लॉन्च नहीं करेगा।
ग्राहम मिलन

1

यदि आपको प्रत्येक 10 सेकंड की तुलना में अधिक बार स्क्रिप्ट शुरू करने की आवश्यकता है, तो यह "फोर्किंग" (पढ़ें: मेमोरी आवंटित करना, नई प्रक्रियाएं शुरू करना आदि) की अवधि में महंगा हो सकता है।

इसलिए, इस मामले में अपना खुद का " डेमॉन " लिखने के लिए सबसे अच्छा है (कार्यक्रम, पृष्ठभूमि में क्या चलता है)

मैं आपको BASH के रूप में "अधिक सक्षम" भाषा का उपयोग करने की सलाह देता हूं (मेरा पसंदीदा "पर्ल" है, लेकिन माणिक भी ठीक है) क्योंकि एक अच्छा डेमन टाइमआउट, अलार्म और इतने पर चीजें संभालता है - जो शुद्ध बैश में बहुत कठिन है। (बेशक, डेमन आपकी बैश स्क्रिप्ट को भी चला सकता है - यदि आवश्यक हो)। मूल बातें हैं:

  • स्क्रिप्ट जो अंतहीन चल रही है और किसी घटना की प्रतीक्षा कर रही है। घटना कुछ नेटवर्क इनपुट, या साधारण टाइमर या कुछ भी हो सकती है। जब घटना आती है (उदाहरण के लिए प्रतीक्षा की स्थिति समाप्त हो जाती है) तो स्क्रिप्ट वही करेगी जो आप चाहते हैं और चक्र दोहराता है।

पर्ल दुनिया में पहले से ही मॉड्यूल मौजूद हैं जो आपकी स्क्रिप्ट को "डेमॉन" प्रक्रिया के रूप में देखते हैं, उदाहरण के लिए प्रोक :: डेमन । मैं रूबी के साथ अनुभवी नहीं हूं, लेकिन यह लेख आपकी मदद कर सकता है।

जब आप लॉग इन या टर्मिनल से मैन्युअल रूप से लॉग ऑन करते हैं, तो आप सिस्टम स्टार्टअप पर लॉन्चड के माध्यम से या ऑटोमेकर ऐप से अपनी डेमॉन प्रक्रिया शुरू कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.