cron เทียบกับ sleep - อันไหนดีกว่าในแง่ของการใช้ cpu / memory อย่างมีประสิทธิภาพ?


18

กรณี:

ฉันจำเป็นต้องเรียกใช้คำสั่ง / สคริปต์ในช่วงเวลาที่แน่นอนและสำหรับสิ่งนี้ฉันมีสองตัวเลือก:

  1. ตั้งค่าcron-job
  2. ใช้การวนซ้ำsleepในสคริปต์เอง

คำถาม:

ตัวเลือกใดที่ดีกว่าจากมุมมองการใช้ทรัพยากรทำไม เป็นcronวิธีที่ดีกว่า cron ใช้ทริกเกอร์บางอย่างหรืออะไรที่ทำให้มันมีประสิทธิภาพมากกว่าอีก cron? cron ใช้ขั้นตอนอะไรในการตรวจสอบและเริ่มงาน?

คำตอบ:


14

ใช้ cron เพราะเป็นการฝึกฝนที่ดีและมาตรฐานมากกว่า อย่างน้อยถ้านี่เป็นสิ่งที่จะทำงานเป็นประจำ (ไม่ใช่แค่บางสิ่งที่คุณปะติดกันในนาที) cronเป็นวิธีที่สะอาดและเป็นมาตรฐานมากกว่า นอกจากนี้ยังดีกว่าเพราะมันรันเชลล์แยกออกจากเทอร์มินัล - ไม่มีปัญหากับการยกเลิกโดยไม่ตั้งใจและการพึ่งพากระบวนการอื่น ๆ

เกี่ยวกับทรัพยากร: CPU: ทั้งสองกระบวนการนอนหลับ - เมื่อพวกเขานอนหลับพวกเขาจะไม่เสีย CPU cronตื่นขึ้นมาบ่อยขึ้นเพื่อตรวจสอบสิ่งต่าง ๆ แต่มันก็ทำอย่างนั้น (ไม่มีกระบวนการของคุณอีกต่อไป) และนี่เป็นภาระที่น้อยมาก daemons ส่วนใหญ่จะตื่นขึ้นในบางครั้ง หน่วยความจำ: คุณอาจcronทำงานโดยไม่คำนึงถึงกระบวนการนี้ดังนั้นจึงไม่มีค่าใช้จ่ายเลย อย่างไรก็ตาม cron จะเริ่มเชลล์เมื่อสคริปต์ถูกเรียกในขณะที่สคริปต์ของคุณยังคงโหลดในหน่วยความจำ (กระบวนการทุบตีกับสภาพแวดล้อม - ไม่กี่กิโลไบต์เว้นแต่คุณจะโหลดทุกอย่างในตัวแปรเชลล์)

ในทุกเรื่องสำหรับทรัพยากรมันไม่สำคัญ


19

ใช้cron(หรือanacron)

Cron ได้รับการออกแบบมาเพื่อการทำงานเป็นระยะ นั่นเป็นสิ่งเดียวที่ทำและมีงานจำนวนมากใส่ cron มาหลายปีเพื่อทำให้เป็นอย่างที่เป็นอยู่ทุกวันนี้

โอกาสที่คุณจะเขียนตัวจัดตารางเวลาที่ดีกว่าในสคริปต์ของคุณนั้นไม่มีประสิทธิภาพ การใช้ cron จะทำงานได้ดีขึ้นหลีกเลี่ยงการใช้รหัสที่ไม่จำเป็นในสคริปต์ของคุณและทำให้รหัสของคุณกระชับและสามารถบำรุงรักษาได้มากขึ้น

อย่าบูรณาการล้อถ้าคุณไม่ต้อง


10

มีคำตอบcronและsleepประสิทธิภาพที่ดีอยู่แล้ว แต่ฉันต้องการเพิ่มการเปรียบเทียบคุณสมบัติบางอย่าง

Pro cron:

  • ทำงานบนระบบ Unix / Linux อยู่แล้ว
  • มั่นคงและพิสูจน์แล้ว
  • ออกแบบมาสำหรับกระบวนการพื้นหลัง
  • ทำงานจากระบบเริ่มต้นขึ้นเป็นต้นสคริปต์ของคุณจะติดตั้งเมื่อใด
  • รายการรอบระยะยาวได้ง่ายขึ้น (ชั่วโมงวันสัปดาห์)
  • อนุญาตการทำซ้ำในระยะยาวที่ซับซ้อน ("ทุก ๆ วันอาทิตย์เวลา 5:35 น.")

Pro sleep:

  • ง่ายต่อการบำรุงรักษาในสคริปต์
  • ง่ายขึ้นสำหรับกระบวนการเบื้องหน้า
  • ช่วยให้เวลาในการนอนหลับสั้นลงและแม่นยำยิ่งขึ้นกว่าหนึ่งนาที
  • อนุญาตวงจรการนอนหลับ / การกระทำที่ซับซ้อน ("เรียกใช้ส่วนนี้แล้วนอนหลับ 10 วินาทีจากนั้นเรียกใช้ส่วนอื่น ๆ และนอนหลับสองชั่วโมง")

4

cron ใช้ทริกเกอร์บางอย่างหรืออะไรที่ทำให้มันมีประสิทธิภาพมากกว่าอีก cron?

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) ต้องมีการใช้งาน CPU ต่ำและหากคุณต้องการเลียนแบบcronคุณสามารถใช้งานsleepได้อย่างแน่นอน

ปรับปรุง มันเป็นการดีกว่าที่จะสังเกตcrondกิจกรรมของด้วย

strace -p `pidof crond`

คำตอบที่มีการประเมินต่ำมาก
Hashim

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จะดีกว่า มันถูกเขียนขึ้นอย่างแม่นยำสำหรับสิ่งนี้โดยคนที่มักจะเก่งในงานของพวกเขา มันถูกผูกไว้เพื่อทำงานที่ดีขึ้นของมันกว่า shell shell ธรรมดา


5
การนอนหลับทั้งสอง - มีประสิทธิภาพไม่แตกต่างกัน เปลือกหอยของคุณที่หลับก็ตื่นขึ้นเมื่อหลับเท่านั้น มันไม่ได้ใช้ CPU มากกว่า cron หากมีสิ่งใด cron จะตื่นบ่อยขึ้นเพราะต้องตรวจสอบว่ามีอะไรเปลี่ยนแปลงหรือไม่ในขณะที่กระบวนการของคุณเพิ่งหลับตลอดเวลา อย่างไรก็ตามคุณจะได้รับกระบวนการทุบตีอีกครั้ง (นอกเหนือจาก cron ซึ่งทำงานอยู่แล้ว) ดังนั้นจึงใช้ RAM อีกเล็กน้อย (ไม่กี่ kB)
orion

3

ความแตกต่างเกิดขึ้นเมื่อคุณเพิ่มสคริปต์อื่น ๆ ที่จำเป็นต้องนอนหลับคุณจะจบลงด้วยกระบวนการที่เพิ่มขึ้นซึ่งกำลังรออยู่รอบ ๆ แทนที่จะเป็นกระบวนการเดียว (cron) ที่ตื่นขึ้นมาและเรียกใช้สคริปต์ที่กำหนดเวลาไว้ Cron อนุญาตให้หนึ่งกระบวนการที่มีความเชี่ยวชาญในการใช้งานสคริปต์อื่น ๆ ตรงเวลาบวก cron ช่วยให้คุณสามารถจัดตารางเวลาได้อย่างอิสระเมื่อมีบางสิ่งที่ควรทำงานวันของสัปดาห์หรือเดือนเวลาที่กำหนดหรือทุก ๆ 5 นาทีเป็นต้น

* เมื่อเห็นสิ่งนี้อีกครั้งทำให้ฉันคิดถึงข้อดีอีกอย่างของ cron สคริปต์ทั้งหมดที่รันเป็นระยะจะอยู่ในที่เดียวและง่ายต่อการตรวจสอบจากที่นั่นเมื่อใดและบ่อยครั้งที่สคริปต์เหล่านั้นจะทำงาน มิฉะนั้นคุณต้องตรวจสอบสคริปต์แต่ละรายการ


1

มีคำตอบที่ดีและมีข้อมูลมากขึ้นแล้ว แต่ฉันแค่อยากจะชี้ให้เห็นว่าsleepคุณมีความสามารถในการหยุดกระบวนการตามจำนวนเวลาที่แปรผันว่าเป็นฟังก์ชั่นของตัวแปรอื่น ๆ

ถ้าฉันเขียนสคริปต์เพื่อตรวจสอบเปอร์เซ็นต์ของแบตเตอรี่ที่เหลืออยู่และnotify-sendถ้าต่ำกว่าระดับวิกฤติที่กำหนดไว้ล่วงหน้าฉันสามารถสร้างสคริปต์sleepตามระยะเวลาซึ่งเป็นฟังก์ชันของระดับแบตเตอรี่ปัจจุบันเป็นเปอร์เซ็นต์แทนที่จะตรวจสอบแบตเตอรี่ทุกครั้ง หนึ่งหรือสองนาทีด้วยความช่วยเหลือของ cron แม้ว่าฉันจะรู้ว่ามันเป็น 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มัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.