cron Vs. ngủ - cái nào tốt hơn về mặt sử dụng cpu / bộ nhớ hiệu quả?


18

Trường hợp:

Tôi cần chạy một số lệnh / script trong khoảng thời gian nhất định và đối với điều này tôi có hai tùy chọn:

  1. thiết lập một cron-job
  2. thực hiện một vòng lặp với sleeptrong chính kịch bản.

Câu hỏi:

Đó là lựa chọn tốt hơn từ quan điểm tiêu thụ tài nguyên, tại sao? Là croncách tốt hơn? Có phải cron sử dụng một số loại kích hoạt hoặc một cái gì đó làm cho nó hiệu quả hơn các loại khác? Cron sử dụng thủ tục gì để kiểm tra và bắt đầu công việc?

Câu trả lời:


14

Sử dụng cron vì nó là một thực hành tốt hơn và tiêu chuẩn hơn. Ít nhất nếu đây là thứ sẽ thường xuyên chạy (không chỉ là thứ bạn đã vá với nhau trong một phút). cronlà một cách sạch hơn và tiêu chuẩn hơn. Nó cũng tốt hơn bởi vì nó chạy vỏ tách ra từ một thiết bị đầu cuối - không có vấn đề gì với việc chấm dứt tình cờ và phụ thuộc vào các quy trình khác.

Về tài nguyên: CPU: Cả hai quá trình đều ngủ - khi chúng ngủ, chúng không lãng phí CPU. cronthức dậy thường xuyên hơn để kiểm tra mọi thứ, nhưng dù sao nó cũng làm điều đó (không còn cho quá trình của bạn). Và đây là tải không đáng kể, hầu hết các daemon thỉnh thoảng thức dậy. Bộ nhớ: Bạn có thể đã cronchạy bất kể quá trình này, vì vậy đây không phải là chi phí chung. Tuy nhiên, cron sẽ chỉ khởi động shell khi tập lệnh được gọi, trong khi tập lệnh của bạn vẫn được tải trong bộ nhớ (một quá trình bash với môi trường - một vài kilobyte, trừ khi bạn đang tải mọi thứ trong các biến shell).

Tất cả trong tất cả, đối với tài nguyên nó không thành vấn đề.


19

Sử dụng cron(hoặc anacron).

Cron được thiết kế để chạy mọi thứ trong khoảng thời gian. Đó là điều duy nhất nó làm, và đã có rất nhiều công việc được đưa vào cron trong nhiều năm để biến nó thành như ngày nay.

Cơ hội mà bạn sẽ viết một trình lập lịch biểu tốt hơn trong kịch bản của mình là không có hiệu quả. Sử dụng cron sẽ hoạt động tốt hơn, tránh có mã không cần thiết trong tập lệnh của bạn và giữ cho mã của bạn ngắn gọn và dễ bảo trì hơn.

Không phát minh lại bánh xe nếu bạn không phải.


10

Đã có một số câu trả lời tốt trên cronsleepbiểu diễn, nhưng tôi muốn thêm một số loại tính năng so sánh.

Chuyên nghiệp cron:

  • đã chạy trên các hệ thống Unix / Linux
  • ổn định và đã được chứng minh
  • được thiết kế cho các quá trình nền
  • chạy từ khởi động hệ thống trở đi, và tập lệnh của bạn cũng vậy, sau khi được cài đặt
  • dễ dàng nhập các chu kỳ dài hạn (giờ, ngày, tuần)
  • cho phép lặp lại dài hạn phức tạp ("mỗi Chủ nhật thứ hai lúc 5:35 sáng")

Chuyên nghiệp sleep:

  • dễ dàng hơn để duy trì trong một kịch bản
  • dễ dàng hơn cho các quá trình tiền cảnh
  • cho phép thời gian ngủ ngắn hơn và chính xác hơn một phút
  • cho phép các chu kỳ ngủ / hành động phức tạp ("chạy phần này, sau đó ngủ 10 giây, sau đó chạy phần kia và ngủ hai tiếng")

4

Có phải cron sử dụng một số loại kích hoạt hoặc một cái gì đó làm cho nó hiệu quả hơn các loại khác?

Tôi đã xem qua cat /proc/`pidof crond`/stack. Đã in nó vài lần liên tiếp tôi thấy rằng crondchỉ ngủ trong hrtimer_nanos ngủ.

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

sleep tiện ích sử dụng cùng một cuộc gọi hệ thống.

>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

Tôi giả sử cả hai tiện ích ( crond& sleep) phải có mức sử dụng CPU thấp và nếu bạn cần bắt chước, cronbạn chắc chắn có thể sử dụng sleep.

Cập nhật. Nó là tốt hơn để quan sát crondhoạt động của với

strace -p `pidof crond`

Câu trả lời bị đánh giá thấp.
Hashim

3

Sự khác biệt chính mà bạn đang tìm kiếm cronlà không chạy liên tục. Như đã giải thích trong 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.

Nói cách khác, cronsẽ chỉ được bắt đầu một lần một phút và nó sẽ kiểm tra xem nó có nên chạy hay không. Mặt khác, cách tiếp cận giấc ngủ của bạn sẽ yêu cầu sleeplệnh thực tế của bạn , vỏ của bạn, thiết bị đầu cuối của bạn và whilevòng lặp (hoặc bất cứ thứ gì) để chạy cùng một lúc.

Ngay cả khi họ đã khởi chạy cùng một số quy trình, cronsẽ tốt hơn. Nó được viết chính xác cho điều này bởi những người có xu hướng rất giỏi trong công việc của họ. Nó chắc chắn sẽ làm một công việc tốt hơn của nó hơn là một vòng lặp shell đơn giản.


5
Cả hai giấc ngủ - có hiệu quả không có sự khác biệt. Vỏ của bạn ngủ cũng chỉ thức dậy khi hết giấc ngủ. Nó không sử dụng bất kỳ CPU nào nhiều hơn cron. Nếu bất cứ điều gì, cron thức dậy thường xuyên hơn bởi vì nó phải kiểm tra nếu có bất cứ điều gì thay đổi, trong khi quá trình của bạn chỉ ngủ mọi lúc. Tuy nhiên, bạn nhận được một quá trình bash khác được tải (ngoài cron, dù sao nó cũng chạy), vì vậy nó sử dụng thêm một chút RAM (một vài kB).
orion

3

Sự khác biệt là khi bạn thêm nhiều tập lệnh cần ngủ, bạn sẽ kết thúc với nhiều quá trình ngủ chờ hơn, thay vì một quy trình (cron) thức dậy và chạy bất kỳ tập lệnh theo lịch trình nào sẽ đóng cho đến lần chạy tiếp theo. Cron cho phép một quy trình chuyên chạy các kịch bản khác đúng giờ, cộng với cron cho phép bạn lên lịch tương đối tự do khi có thứ gì đó nên chạy, các ngày trong tuần hoặc tháng, thời gian cụ thể hoặc chỉ sau mỗi 5 phút, v.v.

* Chỉ cần nhìn thấy điều này một lần nữa làm tôi nghĩ đến một lợi thế khác của cron. Tất cả các tập lệnh chạy định kỳ sau đó ở một nơi và thật dễ dàng để kiểm tra từ đó khi nào và tần suất chúng sẽ chạy. Nếu không, bạn phải kiểm tra các kịch bản cá nhân.


1

Đã có những câu trả lời hay và nhiều thông tin hơn, nhưng tôi chỉ muốn chỉ ra rằng sleep, với khả năng, bạn có khả năng đóng băng quá trình trong một khoảng thời gian khác nhau, nói như là một hàm của một số biến khác.

Nếu tôi đang viết tập lệnh để kiểm tra phần trăm pin còn lại và notify-sendnếu nó ở dưới mức tới hạn được xác định trước, tôi có thể tạo tập lệnh sleepcho khoảng thời gian là chức năng của mức pin hiện tại theo tỷ lệ phần trăm thay vì kiểm tra pin mỗi một hoặc hai phút với sự trợ giúp của cron ngay cả khi tôi biết nó là 80% khi kiểm tra lần cuối.

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

Sử dụng sleepthay vì croncho một công việc có thể hiệu quả hơn. Nhưng vì bạn thường cronchạy trong mọi trường hợp, nên việc sử dụng nó miễn phí hoặc gần đủ để không có sự khác biệt. Vì vậy, trừ khi bạn đang ở trên một cronhệ thống nhúng miễn phí khác , tôi sẽ đi cron.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.