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

Дело:

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

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

Вопрос:

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

8 Solutions collect form web for “cron Vs. сон – что лучше с точки зрения эффективного использования процессора / памяти?”

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

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

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

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

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

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

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

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

Pro cron :

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

Про sleep :

  • легче поддерживать в скрипте
  • проще для процессов переднего плана
  • позволяет время сна короче и точнее, чем минута
  • позволяет выполнить сложные циклы сна / действия («запустите эту часть, затем спать 10 секунд, затем запустите другую часть и спите два часа»)

Основное отличие, которое вы ищете, это то, что 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 потребует вашей фактической команды sleep , вашей оболочки, вашего терминала и цикла while (или любого другого), который будет работать одновременно.

Даже если бы они запускали одинаковое количество процессов, 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 ) должны иметь низкое использование центрального процессора, и если вам нужно подражать cron вы определенно можете использовать sleep .

Обновить. Лучше наблюдать активность crond с

 strace -p `pidof crond` 

Разница заключается в том, что при добавлении дополнительных скриптов, которые должны спать, вы получите больше процессов, ожидающих сна, а не один процесс (cron), который просыпается и запускает любые запланированные сценарии, которые затем закрываются до следующего запуска. Cron позволяет один процесс, который специализируется для запуска других сценариев вовремя, плюс cron позволяет вам планировать относительно свободно, когда что-то должно быть запущено, дни недели или месяца, определенное время или только каждые 5 минут и т. Д.

* Просто увидев это, я снова подумал о другом преимуществе cron. Все сценарии, которые периодически запускаются, находятся в одном месте, и от них легко проверить, когда и как часто они будут выполняться. В противном случае вам необходимо проверить отдельные сценарии.

Использование sleep вместо cron для одного задания может быть более эффективным. Но поскольку вы, как правило, работаете cron в любом случае, использование его происходит бесплатно или почти достаточно, так как не имеет никакого значения. Поэтому, если вы не используете встроенную систему cron free, я бы пошел за cron .

Уже есть хорошие и более обоснованные ответы, но я просто хотел указать, что со 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 
  • Не удается использовать компьютер после того, как Linux mint переходит в спящий режим
  • CentOS 6.5 не будет спать после периода бездействия
  • проверка статуса для команды sleep
  • Как влиять на цикл bash while с временной глобальной переменной?
  • Как спать до определенной даты и времени?
  • Как узнать, когда устройство готово
  • Interesting Posts

    Как получить идентификатор окна из xdotool Window Stack

    Проблема с ffmpeg в петле bash

    Замените в верхнем регистре на нижний регистр, кроме первой буквы каждого слова в определенной строке

    Можно ли написать в crontab из многоцелевого скрипта?

    Улучшение шрифтов Fedora 17

    Как я могу автоматически привязывать монтирование к загрузке в домашнем каталоге, не зашифрованном зашифрованным корнем?

    Как перенести виртуальную виртуальную машину VirtualBox на металл

    Сумма в блоке с AWK (перезапуск суммы при изменении шаблона)

    Как создать общий ресурс Samba, доступный для записи из Windows без разрешения 777?

    Как создать img-образ, достаточно большой для хранения одного конкретного файла?

    «Фильтр не удался» из hplip

    ACL назвал групповые разрешения не переопределением прав доступа к файлам. Зачем?

    Проблема с созданием образа необработанного диска и его установкой в ​​режиме спасения на QEMU

    Приглашение командной строки tcsh для показа недоделанных заданий

    Обнаружение поврежденного аудио CD

    Linux и Unix - лучшая ОС в мире.