крон против сон - что лучше с точки зрения эффективного использования процессора / памяти?


18

Дело:

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

  1. создать cron-job
  2. реализовать цикл sleepв самом скрипте.

Вопрос:

Какой вариант лучше с точки зрения потребления ресурсов, почему? Это cronлучший способ? Использует ли cron какие-то триггеры или что-то, что делает его более эффективным по сравнению с другим? Какую процедуру использует cron для проверки и запуска заданий?

Ответы:


14

Используйте cron, потому что это лучшая и более стандартная практика. По крайней мере, если это то, что будет работать регулярно (а не то, что вы исправили за минуту). cronэто более чистый и более стандартный способ. Это также лучше, потому что он запускает оболочку отдельно от терминала - никаких проблем со случайным завершением и зависимостями от других процессов.

Что касается ресурсов: CPU: оба процесса спят - когда они спят, они не тратят впустую CPU. cronчаще просыпается, чтобы проверить вещи, но все равно делает это (больше не для вашего процесса). И это незначительная нагрузка, большинство демонов просыпаются время от времени. Память: вы, вероятно, cronработаете независимо от этого процесса, так что это совсем не накладные расходы. Однако cron запускает оболочку только при вызове скрипта, тогда как ваш скрипт остается загруженным в память (процесс bash со средой - несколько килобайт, если вы не загружаете все в переменные оболочки).

В общем, для ресурсов это не имеет значения.


19

Используйте cron(или anacron).

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

Вероятность того, что вы собираетесь написать лучший планировщик в вашем скрипте, практически равна нулю. Использование cron будет работать лучше, избегая ненужного кода в вашем скрипте, а также сделайте ваш код лаконичным и более понятным.

Не изобретайте велосипед, если вам это не нужно.


10

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

Pro cron:

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

Pro 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 просыпается чаще, потому что он должен проверить, изменилось ли что-нибудь, а ваш процесс просто все время спит. Тем не менее, вы загружаете другой процесс bash (в дополнение к cron, который запускается в любом случае), поэтому он использует немного больше оперативной памяти (несколько кБ).
Орион

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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.