cron Vs. сон - який кращий з точки зору ефективного використання процесора / пам'яті?


18

Справа:

Мені потрібно запустити деякі команди / скрипт через певні проміжки часу, і для цього у мене є два варіанти:

  1. налаштувати a cron-job
  2. реалізувати цикл у sleepв самому сценарії.

Питання:

Який кращий варіант з точки зору споживання ресурсів, чому? Чи cronкращий спосіб? Чи використовує cron якісь тригери чи щось робить його ефективнішим за інших? Яку процедуру використовує cron для перевірки та запуску завдань?

Відповіді:


14

Використовуйте cron, тому що це краща і більш стандартна практика. Принаймні, якщо це те, що регулярно буде працювати (не просто те, що ви зафіксували разом за хвилину). cronце більш чистий і стандартний спосіб. Це також краще, оскільки він запускає оболонку, відірвану від терміналу - не виникає проблем із випадковим припиненням та залежністю від інших процесів.

Щодо ресурсів: процесор: обидва процеси сплять - коли вони сплять, вони не витрачають процесор. cronпрокидається частіше, щоб перевірити речі, але все одно це робить (не більше для вашого процесу). І це мізерне навантаження, більшість демонів прокидаються періодично. Пам'ять: напевно, ви cronпрацюєте незалежно від цього процесу, тому це взагалі не є накладними. Однак, cron запустить оболонку лише тоді, коли викликається скрипт, тоді як ваш скрипт залишається завантаженим у пам'яті (баш-процес із середовищем - кілька кілобайт, якщо ви не завантажуєте все в змінні оболонки).

Загалом, для ресурсів це не має значення.


19

Використовуйте cron(або anacron).

Cron призначений для ведення речей з інтервалом. Це єдине, що робиться, і багато років було зроблено багато робіт, щоб зробити його таким, яким він є сьогодні.

Шанси, що ви збираєтеся написати кращий планувальник у своєму сценарії, фактично нульові. Використання cron буде працювати краще, уникайте зайвого коду у вашому сценарії, а ваш код буде стислим та більш ретельним.

Не вигадуйте колесо, якщо цього не потрібно.


10

Є вже деякі хороші відповіді на cronі sleepпродуктивності, але я хочу , щоб додати якийсь - то порівняння функцій.

Про cron:

  • працює вже в системах Unix / Linux
  • стабільний і перевірений
  • призначений для фонових процесів
  • запускається від запуску системи і далі, як і ваш сценарій після встановлення
  • полегшення вступу довгострокових циклів (години, дні, тижні)
  • дозволяє складні довготривалі повтори ("кожну другу неділю о 5:35 ранку")

Про sleep:

  • легше підтримувати в сценарії
  • полегшити процеси переднього плану
  • дозволяє час сну коротший і точніший за хвилину
  • дозволяє складні цикли сну / дії ("запустити цю частину, потім спати 10 секунд, потім запустити іншу частину і спати дві години")

4

Чи використовує 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) повинні мати низьке використання процесора, і якщо вам потрібно наслідувати, 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
Обидва сплять - різниці фактично немає. Ваша оболонка, яка спить, також прокидається лише тоді, коли спливає час сну. Він не використовує більше процесора, ніж cron. Якщо що-небудь, Cron прокидається частіше, тому що він повинен перевіряти, чи щось змінилося, а ваш процес просто спить весь час. Однак у вас завантажується ще один баш-процес (крім крона, який все одно працює), тому він використовує трохи більше оперативної пам’яті (кілька кБ).
Оріон

3

Різниця полягає в тому, що, додаючи більше сценаріїв, які потребують сну, у вас з’явиться більше процесів сну, які очікують, а не один процес (cron), який прокидається і запускає будь-які заплановані сценарії, які потім закриваються до наступного запуску. Cron дозволяє виконувати один процес, який спеціалізується на запуску інших сценаріїв у часі, плюс cron дозволяє відносно вільно скласти графік, коли щось потрібно виконувати, дні тижня чи місяця, конкретні години або просто кожні 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.