Answers:
使用cron是因为它是更好和更标准的做法。至少如果这是可以正常运行的东西(而不仅仅是在一分钟内修补在一起的东西)。cron
是一种更清洁,更标准的方法。这样做也更好,因为它运行从终端分离的外壳程序-意外终止和对其他进程的依赖没有问题。
关于资源:CPU:两个进程都处于睡眠状态-睡眠时,它们不会浪费CPU。cron
醒来会更频繁地检查事物,但是无论如何都会这样做(对于您的过程而言,不再有用)。而且这是微不足道的负载,大多数守护程序偶尔会唤醒。内存:cron
无论此过程如何,您都可能在运行,因此完全没有开销。但是,cron仅在调用脚本时启动外壳程序,而脚本仍保持加载到内存中(带有环境的bash进程-几千字节,除非您将所有内容都加载到shell变量中)。
总而言之,资源无关紧要。
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
)必须具有较低的CPU利用率,并且如果您需要模仿cron
,则可以完全使用sleep
。
更新。最好观察crond
一下
strace -p `pidof crond`
您正在寻找的主要区别是 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循环做得更好。
区别在于,当您添加更多需要休眠的脚本时,最终将有更多进程在等待,而不是单个进程(cron)唤醒并运行所有计划的脚本,然后关闭这些脚本直到下一次运行。Cron允许一个专门用于按时运行其他脚本的进程,另外cron允许您相对自由地安排应运行的时间,星期几或一个月的天数,特定时间或每5分钟一次等。
*再次看到这一点使我想到了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