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

#!/bin/bash
dir="$HOME/TAM/dustbin"

# check if the dir is empty
shopt -s nullglob
files=("$dir"/*)
if (( ${#files[@]} == 0 )); then
    echo "the directory is empty"
    exit
fi

# handle command line arguments
all=false
while getopts :a opt; do
    case $opt in
        a) all=true ;;
        ?) echo "unknown option: -$OPTARG"; exit 1 ;;
    esac
done
shift $((OPTIND - 1))

# perform the deletion
if $all; then
    command rm "$dir"/*
else
    command rm -i "$dir"/*
fi
18
17.05.2016, 20:43
8 ответов
[113273] Используйте cron, потому что это лучшая и более стандартная практика. По крайней мере, если это что-то, что будет регулярно выполняться (а не просто что-то, что вы исправили за минуту). [113563] cron [113564] - более чистый и стандартный способ. Также лучше, потому что он запускает оболочку, отделенную от терминала - никаких проблем со случайным завершением и зависимостями от других процессов.

Относительно ресурсов: ПРОЦЕССОР: Оба процесса спят - когда они спят, они не тратят впустую процессор. [113565]cron[113566] чаще просыпается, чтобы проверить что-то, но он все равно это делает (для вашего процесса больше нет). И это ничтожная нагрузка, большинство демонов просыпаются время от времени. Память: Вероятно, у вас [113567]cron[113568] работает независимо от этого процесса, так что это вовсе не накладные расходы. Однако, cron запустит оболочку только при вызове скрипта, в то время как ваш скрипт останется загруженным в памяти (bash-процесс с окружением - несколько килобайт, если только вы не загружаете все в переменные оболочки).

В целом, для ресурсов это не имеет значения.[113278]

14
27.01.2020, 19:45
[112434]Используйте [112864]cron[112865] (или [112866]anacron[112867]).

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

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

Не изобретайте колесо заново, если вам не нужно.[112441].

19
27.01.2020, 19:45

  1. Использует ли Крон какие-нибудь триггеры или что-нибудь, что делает его эффективным по сравнению с другими?
  2. Я взглянул на [112892]cat /proc/`pidof crond`/stack[112893]. Напечатав его несколько раз подряд, я вижу, что [112894]crond[112895] просто спит в hrtimer_nanosleep. Утилита
  3. sleep[112897] использует тот же самый системный вызов. Я предполагаю, что обе утилиты ([112898] crond[112899] и [112900] sleep[112901])). должен иметь низкую загруженность процессора, и если вам нужно подражать [112902]cron[112903], вы можете использовать [112904]sleep[112905].
  4. Update. Лучше наблюдать за работой [112906]crond[112907] с
4
27.01.2020, 19:45
[112448]Главное отличие, которое вы ищете, заключается в том, что [112878]cron[112879] не работает постоянно. Как объяснялось в [112880]man cron[112881]:

Другими словами, [112882]cron[112883] будет запускаться только один раз в минуту и будет проверять, следует ли его запускать. Ваш подход "сна", с другой стороны, потребует, чтобы ваша фактическая команда [112884] sleep[112885], ваша оболочка, ваш терминал, и [112886] в то время как [112887] (или что-то в этом роде) цикл был запущен в то же время. Даже если бы они запускали одинаковое количество процессов, [112888]cron[112889] было бы лучше. Именно для этого и пишут люди, которые, как правило, очень хорошо справляются со своей работой. Он наверняка сделает это лучше, чем простой цикл оболочки. [112453]

3
27.01.2020, 19:45
[114106] Уже есть хорошие ответы на вопросы о производительности [114542] cron[114543] и [114544] sleep[114545], но я хочу добавить некоторое сравнение возможностей.

Pro [114546]cron[114547]:

стабильный и проверенный

, предназначенный для фоновых процессов

работает с момента запуска системы и далее, так же как и ваш скрипт, после установки

более легкий ввод длительных циклов (часов, дней, недель)

позволяет сложные длительные повторы ("каждое второе воскресенье в 5:35 утра". ")

delay 0.3 -- time to release modifier keys if the script is run with a shortcut
tell application "System Events" to tell (process 1 where frontmost is true)
    if name is "Google Chrome" then
        keystroke "p" using {option down, command down}
        delay 0.1
        tell menu button 1 of window 1
            click
            click menu item "Save as PDF…" of menu 1
        end tell
        keystroke "l" using {option down, command down}
        keystroke return
    else
        keystroke "p" using command down
        tell menu button 1 of sheet 1 of window 1
            click
            click menu item "Save as PDF…" of menu 1
        end tell
        keystroke "l" using {option down, command down}
        keystroke return
    end if
end tell

Pro [114560] сна [114561]:

tell application "Google Chrome" to tell active tab of window 1
    set u to URL
    set t to title
end tell
do shell script "wkpdf --source " & quoted form of u & " --output ~/Desktop/" & quoted form of t & ".pdf"

легче поддерживать в сценарии

легче для процессов на переднем плане

позволяет время сна короче и точнее, чем минута

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

10
27.01.2020, 19:45
[113407] Использование [113711]sleep[113712] вместо [113713]cron[113714] для одного задания может быть более эффективным. Но так как обычно [113715] cron[113716] работает в любом случае, использование его приходит бесплатно, или достаточно близко, так как никакой разницы нет. Так что если вы не работаете на свободной встроенной системе [113717] cron[113718], я бы выбрал [113719] cron[113720].[113408].
0
27.01.2020, 19:45
[114102] Разница заключается в том, что по мере того, как вы добавляете больше скриптов, которые должны спать, вы закончите с большим количеством процессов, ожидающих своей очереди, вместо одного процесса (cron), который просыпается и запускает любые запланированные скрипты, которые затем закрываются до следующего запуска. Cron позволяет один процесс, который специализируется на выполнении других скриптов вовремя, плюс cron позволяет вам планировать относительно свободно, когда что-то должно быть запущено, дни недели или месяца, определенное время, или просто каждые 5 минут и т.д.

*Видение этого снова заставило меня задуматься о другом преимуществе Крона. Все скрипты, которые выполняются периодически, затем находятся в одном месте, и оттуда легко проверить, когда и как часто они будут выполняться. Иначе нужно проверять отдельные скрипты. [114105]

3
27.01.2020, 19:45

Здесь уже есть хорошие и более информированные ответы, но я просто хотел отметить, что с 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
1
27.01.2020, 19:45

Теги

Похожие вопросы