हर X सेकंड पर कमांड करें


10

मैं 10 सेकंड में एक कमांड करने की इच्छा रखता हूं, और क्या इसे पृष्ठभूमि में निष्पादित किया गया है (इस तरह से watch?)। सभी उत्तर निम्नलिखित की तरह कुछ दिखाते हैं, लेकिन यह कभी भी 11 से 14 सेकंड तक निष्पादित होगा। इसे किस तरह पूर्ण कर सकते है?

while true; do
    # perform command that takes between 1 and 4 seconds
    sleep 10
done

शायद वास्तविक समय के संकेतों के साथ। और छलांग सेकंड की उचित हैंडलिंग। सौभाग्य।
माइकर्स

@mikeserv तो, कोशिश कर परेशान नहीं है? मुझे मिलि-सेकेंड सटीकता की परवाह नहीं है, बस आधा सेकंड कहें।
user1032531

आप क्या खत्म करने की कोशिश कर रहे हैं? मुझे लगता है कि एक कार्य जिसे उस तरह की आवृत्ति के साथ चलना होता है, आमतौर पर किसी अन्य समस्या के लिए एक समाधान है।
Sobrique

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

जवाबों:


16

कैसा रहेगा:

( # In a subshell, for isolation, protecting $!
  while true; do
    perform-command & # in the background
    sleep 10 ;
    ### If you want to wait for a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line:
    # wait $! ;
    ### If you prefer to kill a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line instead:
    # kill $! ;
    ### (If you prefer to ignore it, uncomment neither.)
  done
)

ईटीए: उन सभी टिप्पणियों, विकल्पों और अतिरिक्त सुरक्षा के लिए उपधारा के साथ, जो शुरू होने की तुलना में बहुत अधिक जटिल लगता है। इसलिए, तुलना करने के लिए, यहां यह देखने से पहले कि मुझे क्या चिंता थी waitया अलगाव के लिए killउनकी $!और आवश्यकता के साथ शुरू हुआ था :

while true; do perform-command & sleep 10 ; done

बाकी वास्तव में सिर्फ इसके लिए है जब आपको इसकी आवश्यकता होती है।


क्या आप अपने कोड डंप के पीछे का कारण बता सकते हैं?
इस्माइल मिगुएल

2
इसके अलावा, यह बताने के लिए कि आपके कोड के लिए कौन सा शेल काम करता है (जैसे mikeserv का जवाब) ताकि लोग भ्रमित न हों जब एक अलग शेल अलग तरीके से व्यवहार करता है :)
ash

@IsmaelMiguel मुझे लगा कि टिप्पणी तर्क को स्पष्ट करेगी। मुझे यकीन नहीं है कि क्या अस्पष्ट है।
सीधीक

1
बैश मैनुअल कहता है $!: "नौकरी की प्रक्रिया आईडी को सबसे हाल ही में पृष्ठभूमि में रखा गया है," और sleepइसे पृष्ठभूमि में नहीं रखा गया है, इसलिए नहीं, यह नहीं होगा। :)
सिद्धांक

1
वाह। दोनों मायने रखता है। वह कब हुआ?
20

9

आप की तरह कुछ में निम्न कर सकते हैं bash, zshया ksh:

SECONDS=0
while   command
do      sleep "$((10-(SECONDS%10)))"
done

यहाँ bashमैनुअल के बारे में क्या कहते हैं $SECONDS:

$SECONDS

  • जब भी इस पैरामीटर को संदर्भित किया जाता है, शेल इनवोकेशन के बाद से सेकंड की संख्या वापस आ जाती है। यदि कोई मान असाइन किया गया है $SECONDS, तो बाद के संदर्भों पर लौटाया गया मान असाइनमेंट प्लस असाइन किए गए मूल्य के बाद से सेकंड की संख्या है। यदि $SECONDSहै unset, तो यह अपने विशेष गुणों को खो देता है, भले ही यह बाद में रीसेट हो।

यहाँ एक काम कर उदाहरण है:

(   SECONDS=0
    while   sleep   "$((RANDOM%10))"
    do      sleep   "$((10-(SECONDS%10)))"
            echo    "$SECONDS"
    done
)

10
20
30
40
50
60
70
80
90
100

2
रीसेट करने से बचने के SECONDSलिए sleep "$((10-(($SECONDS-$start_time)%10)))"। आपको start_time=$SECONDSलूप से पहले करना होगा ।
ctrl-alt-delor-

@ श्रीखंड - इससे क्यों बचें?
मोकेसर

क्योंकि एक दिन आपके पास यह एक स्क्रिप्ट में होगा जिसे आप ऐसे लूप में कहते हैं। और आप पूरे दिन यह सोचकर बिताएंगे कि यह ठीक से काम क्यों नहीं कर रहा है। संक्षेप में, यह घोंसला नहीं करता है, यदि आप रीसेट करते हैं SECONDS। अपने नवीनतम संपादन में एक उप-शेल को खोलना, इस समस्या से भी बचना चाहिए।
बजे ctrl-alt-delor-

1
@richard - चूंकि प्रश्न एक while trueलूप के बारे में था, इसलिए मैंने यह अनुमान नहीं लगाया था कि किसी भी शेल राज्य के जीवित रहने की उम्मीद है। लूप को अपने संदर्भ में इस तरह लपेटना आमतौर पर सबसे अच्छा अभ्यास है, वैसे भी। जैसे कि मैं और अधिक के लिए ऐसा करने के बारे में चिंतित हो जाएगा स्थिति में trap'के लिए की तुलना में रों खातिर $SECONDSखातिर', हालांकि।
मोकेसर

धन्यवाद माइक, मैं कुछ ऐसा ही करने के लिए सोच रहा था (लेकिन अभी तक पता नहीं है कि कैसे)। लेकिन सिडकिन का समाधान एक ही काम करता है, नहीं? मैं बेहतर जवाब पर निर्णय लेने के लिए योग्य नहीं हूं, लेकिन कुछ लेने के लिए बाध्य महसूस किया।
user1032531

3

केवल BASH - आप अपने कमांड द्वारा बिताए गए समय की गणना कर सकते हैं और 10 से घटा सकते हैं:

TIMEFORMAT=$'%0R'
while true; do
    T=$({ time command; } 2>&1)
    sleep $(( 10-T ))

BASH आदमी से:

TIMEFORMAT इस पैरामीटर के मान का उपयोग एक प्रारूप स्ट्रिंग के रूप में किया जाता है, जिसमें निर्दिष्ट किया जाता है कि आरक्षित शब्द के साथ उपसर्ग करने वाली पाइपलाइनों की समय की जानकारी कैसे प्रदर्शित की जानी चाहिए। % वर्ण एक भागने के क्रम का परिचय देता है जिसे एक समय मान या अन्य जानकारी में विस्तारित किया जाता है। भागने के क्रम और उनके अर्थ निम्नानुसार हैं; ब्रेसिज़ वैकल्पिक भागों को दर्शाते हैं।
%% एक शाब्दिक%।
% [पी] [एल] आर सेकंड में बीता समय।
% [पी] [एल] यू उपयोगकर्ता मोड में खर्च किए गए सीपीयू सेकंड की संख्या।
% [पी] [एल] एस सिस्टम मोड में खर्च किए गए सीपीयू सेकंड की संख्या।
% P CPU प्रतिशत, (% U +% S) /% R के रूप में गणना की जाती है।

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

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