cronVS。睡眠-就有效的CPU /内存利用率而言,哪种更好?


18

案子:

我需要在特定的时间间隔运行一些命令/脚本,为此,我有两个选择:

  1. 成立了cron-job
  2. sleep在脚本本身中实现一个循环。

题:

从资源消耗的角度来看,哪个是更好的选择,为什么?是cron更好的方法吗?cron是否使用某种触发器或使其比其他触发器更有效的触发器?cron使用什么程序来检查和启动作业?

Answers:


14

使用cron是因为它是更好和更标准的做法。至少如果这是可以正常运行的东西(而不仅仅是在一分钟内修补在一起的东西)。cron是一种更清洁,更标准的方法。这样做也更好,因为它运行从终端分离的外壳程序-意外终止和对其他进程的依赖没有问题。

关于资源:CPU:两个进程都处于睡眠状态-睡眠时,它们不会浪费CPU。cron醒来会更频繁地检查事物,但是无论如何都会这样做(对于您的过程而言,不再有用)。而且这是微不足道的负载,大多数守护程序偶尔会唤醒。内存:cron无论此过程如何,您都可能在运行,因此完全没有开销。但是,cron仅在调用脚本时启动外壳程序,而脚本仍保持加载到内存中(带有环境的bash进程-几千字节,除非您将所有内容都加载到shell变量中)。

总而言之,资源无关紧要。


19

使用cron(或anacron)。

Cron专为间隔运行而设计。那是它唯一要做的事情,而且要使cron成为今天的样子,已经有很多年了cron投入了很多工作。

您要在脚本中编写更好的调度程序的机会实际上是零。使用cron会更好地工作,避免脚本中包含不必要的代码,并使代码简洁明了并更具可维护性。

如果没有必要,不要重新发明轮子。


10

目前已经有一些很好的答案cronsleep性能,但我想添加某种功能的比较。

专业版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

我认为这两个实用程序(crondsleep)必须具有较低的CPU利用率,并且如果您需要模仿cron,则可以完全使用sleep

更新。最好观察crond一下

strace -p `pidof crond`

被低估的答案。
Hashim

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也会更好。正是为此而写的,正是那些往往善于工作的人。它肯定比简单的shell循环做得更好。


5
两种睡眠-实际上没有区别。睡眠的外壳也仅在睡眠到期时才唤醒。它不使用比cron更多的CPU。如果有的话,cron会更频繁地唤醒,因为它必须检查是否有任何更改,而您的进程始终处于休眠状态。但是,您确实加载了另一个bash进程(除了cron以外,它始终在运行),因此它使用了更多的RAM(几kB)。
Orion

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.