क्रोन बनाम। नींद - जो कुशल सीपीयू / मेमोरी उपयोग के मामले में बेहतर है?


18

मुकदमा:

मुझे कुछ समय के अंतराल पर कुछ कमांड / स्क्रिप्ट चलाने की आवश्यकता है और इसके लिए मेरे पास दो विकल्प हैं:

  1. cron-जॉब सेट करें
  2. sleepस्क्रिप्ट में ही एक लूप लागू करें ।

सवाल:

संसाधन खपत के दृष्टिकोण से बेहतर विकल्प कौन सा है, क्यों? है cronबेहतर तरीका? क्या क्रोन किसी प्रकार के ट्रिगर्स का उपयोग करता है या कुछ इसे दूसरे पर कुशल बनाता है? नौकरियों को जांचने और शुरू करने के लिए क्रोन किस प्रक्रिया का उपयोग करता है?

जवाबों:


14

क्रोन का उपयोग करें क्योंकि यह एक बेहतर और अधिक मानक अभ्यास है। कम से कम अगर यह एक ऐसी चीज है जो नियमित रूप से चलेगी (न कि सिर्फ एक मिनट में एक साथ पैच करने पर)। cronएक क्लीनर और अधिक मानक तरीका है। यह बेहतर भी है क्योंकि यह एक टर्मिनल से अलग किए गए शेल को चलाता है - आकस्मिक समाप्ति और अन्य प्रक्रियाओं पर निर्भरता के साथ कोई समस्या नहीं।

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

सभी के लिए, संसाधनों के लिए यह कोई फर्क नहीं पड़ता।


19

उपयोग cron(या anacron)।

क्रोन को अंतराल पर चीजों को चलाने के लिए डिज़ाइन किया गया है। यह केवल एक चीज है जो यह करता है, और कई वर्षों से क्रोन में डालने के लिए बहुत काम किया गया है जो आज है।

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

यदि आपके पास नहीं है, तो पहिया को फिर से न करें।


10

प्रदर्शन cronऔर sleepप्रदर्शन के बारे में पहले से ही कुछ अच्छे जवाब हैं , लेकिन मैं किसी तरह की सुविधा की तुलना जोड़ना चाहता हूं।

प्रो cron:

  • यूनिक्स / लिनक्स सिस्टम पर पहले से चल रहा है
  • स्थिर और सिद्ध
  • पृष्ठभूमि प्रक्रियाओं के लिए डिज़ाइन किया गया
  • सिस्टम स्टार्ट-अप के बाद से रन करता है, और इसलिए आपकी स्क्रिप्ट, एक बार स्थापित हो जाएगी
  • दीर्घकालिक चक्रों की आसान प्रविष्टि (घंटे, दिन, सप्ताह)
  • जटिल दीर्घकालिक दोहराव की अनुमति देता है ("हर दूसरे रविवार सुबह 5:35 बजे")

प्रो sleep:

  • एक स्क्रिप्ट में बनाए रखना आसान है
  • अग्रभूमि प्रक्रियाओं के लिए आसान
  • नींद के समय को एक मिनट से कम और अधिक सटीक होने देता है
  • जटिल नींद / क्रिया चक्र की अनुमति देता है ("इस भाग को चलाएं, फिर 10 सेकंड सोएं, फिर दूसरे भाग को चलाएं और दो घंटे सोएं")

4

क्या क्रोन किसी प्रकार के ट्रिगर्स का उपयोग करते हैं या कुछ इसे दूसरे पर कुशल बनाते हैं?

मैंने देख लिया है cat /proc/`pidof crond`/stack। इसे लगातार कुछ समय तक छापने के बाद मैं देखता हूं कि crondबस hrtimer_nanosleep में सोता है।

>cat /proc/`pidof crond`/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

sleep यूटिलिटी उसी सिस्टम कॉल का उपयोग करती है।

>sleep 100 &
[1] 12761
>cat /proc/12761/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

मुझे लगता है कि दोनों उपयोगिताओं ( crondऔर sleep) में कम सीपीयू उपयोग होना चाहिए और अगर आपको नकल करने की आवश्यकता है तो आप cronनिश्चित रूप से उपयोग कर सकते हैं sleep

अपडेट करें। इसके crondसाथ गतिविधि का निरीक्षण करना बेहतर है

strace -p `pidof crond`

अत्यधिक जवाब दिया गया।
हाशिम

3

मुख्य अंतर जो आप देख रहे हैं वह यह cronहै कि लगातार नहीं चल रहा है। जैसा कि समझाया गया है man cron:

   cron then wakes up every minute, examining all stored crontabs,  check
   ing  each  command  to  see  if it should be run in the current minute.
   When executing commands, any output is  mailed  to  the  owner  of  the
   crontab (or to the user named in the MAILTO environment variable in the
   crontab, if such exists).  The children copies of  cron  running  these
   processes  have their name coerced to uppercase, as will be seen in the
   syslog and ps output.

दूसरे शब्दों में, cronकेवल एक मिनट में एक बार शुरू किया जाएगा और यह परीक्षण करेगा कि क्या इसे चलाया जाना चाहिए। दूसरी ओर आपकी नींद का दृष्टिकोण, आपके वास्तविक sleepकमांड, आपके शेल, आपके टर्मिनल, और while(या जो भी) लूप को उसी समय चलाने की आवश्यकता होगी।

यहां तक ​​कि अगर वे समान प्रक्रियाओं को लॉन्च कर रहे थे, cronतो बेहतर होगा। यह उन लोगों द्वारा इसके लिए सटीक रूप से लिखा गया है जो अपनी नौकरी में बहुत अच्छे हैं। यह एक साधारण शेल लूप की तुलना में इसका बेहतर काम करने के लिए बाध्य है।


5
दोनों सोते हैं - प्रभावी रूप से कोई अंतर नहीं है। नींद पूरी होने पर ही आपका खोल भी जागता है। यह क्रोन की तुलना में किसी भी अधिक सीपीयू का उपयोग नहीं करता है। यदि कुछ भी हो, तो क्रोन अधिक बार उठता है क्योंकि उसे यह जांचना पड़ता है कि क्या कुछ बदल गया है, जबकि आपकी प्रक्रिया हर समय सोती है। हालाँकि, आपको एक और बैश प्रक्रिया मिलती है (क्रॉन के अलावा, जो वैसे भी चलती है), इसलिए यह थोड़ी अधिक रैम (कुछ केबी) का उपयोग करता है।
ओरियन

3

अंतर यह आता है कि जैसे ही आप अधिक स्क्रिप्ट जोड़ते हैं, जो सोने की आवश्यकता होती है, आप एक ही प्रक्रिया (क्रोन) के बजाय अधिक प्रक्रियाओं के साथ इंतजार कर रहे हैं, जो किसी भी अनुसूचित स्क्रिप्ट को उठाता है और चलाता है, जो कि अगले रन तक बंद हो जाता है। क्रॉन एक ऐसी प्रक्रिया की अनुमति देता है जो अन्य लिपियों को समय पर चलाने के लिए विशिष्ट है, साथ ही क्रोन आपको अपेक्षाकृत स्वतंत्र रूप से शेड्यूल करने देता है जब कुछ चलना चाहिए, सप्ताह या महीने के दिन, विशिष्ट समय, या बस हर 5 मिनट आदि।

* बस इसे देखकर मुझे फिर से क्रोन के एक और फायदे के बारे में सोचना पड़ा। समय-समय पर चलने वाली सभी स्क्रिप्ट्स एक ही स्थान पर होती हैं, और यह जांचना आसान है कि वे कब और कितनी बार चलेंगे। अन्यथा आपको अलग-अलग स्क्रिप्ट की जांच करनी होगी।


1

कुछ अच्छे और अधिक सूचित उत्तर पहले से ही हैं, लेकिन मैं सिर्फ यह बताना चाहता हूं कि sleepआपके पास समय की चर राशि के लिए प्रक्रिया को फ्रीज करने की क्षमता है, कुछ अन्य चर के फ़ंक्शन के रूप में कहें।

अगर मैं बैटरी के प्रतिशत की जांच करने के लिए स्क्रिप्ट लिख रहा हूं और notify-sendयदि यह पूर्व-परिभाषित महत्वपूर्ण स्तर से नीचे है, तो मैं उस sleepबैटरी की समय-समय पर मात्रा की वर्तमान बैटरी स्तर के लिए स्क्रिप्ट बना सकता हूं, जो बैटरी की जांच करने के बजाय एक या दो मिनट भी क्रोन की मदद से जब मुझे पता है कि यह आखिरी जाँच के समय 80% था।

Battery_notify.sh

#!/bin/bash
CRIT=15
while true; do
    # current battery level
    BAT_LEVEL=`acpi -b |grep -Eo "[0-9]+%"|grep -Eo "[0-9]+"`
    interval=$((($BAT_LEVEL -$CRIT) * 120)) # loose estimate of backup time for each percentage of battery charge.
    # Is AC plugged in?
    state=`acpi -b |grep -Eo "[A-Za-z]+harging"` 
    #only notify if not Plugged in
    if [ "$state" = "Discharging" ] ; then
        # is battery below CRIT level?
        if [ $BAT_LEVEL -le $CRIT ]; then
        aplay ~/apert.wav &
        notify-send "Battery-Low!!!" -i /home/bibek/batt.png -t 900
        sleep 100  # nag me each 100 secs untill I plug the thing 
        else
            sleep $interval
        fi
    else
        # if plugged in sleep 
        if [ $BAT_LEVEL -le $CRIT ]; then
            sleep $interval
        else
            # to check if the AC is unplugged before battery gains charge above CRIT.
            sleep 100 
        fi
    fi
    done

0

एक ही नौकरी sleepके cronलिए उपयोग करना अधिक कुशल हो सकता है। लेकिन जब से आप आम तौर पर cronकिसी भी मामले में चल रहे होते हैं , तो इसका उपयोग करना मुफ्त में आता है, या पास में कोई फर्क नहीं पड़ता है। तो जब तक आप एक अन्यथा cronएम्बेडेड सिस्टम पर हैं, मैं इसके लिए जाऊंगा cron

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