为什么睡眠 300(5 分钟)有时可以持续几个小时?

为什么睡眠 300(5 分钟)有时可以持续几个小时?

我有一台带有 OSX 系统的 MiniMac。

我的脚本是:

while true
  do echo "Sleep 300 seconds = 5 minutes"
  date
  sleep 300
  echo "end of sleep"
  date
done

我希望它每 5 分钟重复一次;但有时当它执行“sleep 300”时,它会暂停几个小时,结果如下:

Sleep 300 seconds = 5 minutes
Fri Nov  8 15:52:49 CET 2013
end of sleep
Fri Nov  8 15:57:49 CET 2013
Sleep 300 seconds = 5 minutes
Fri Nov  8 15:57:49 CET 2013
end of sleep
Fri Nov  8 16:02:49 CET 2013
Sleep 300 seconds = 5 minutes
Fri Nov  8 16:02:49 CET 2013
end of sleep
Fri Nov  8 16:20:59 CET 2013
Sleep 300 seconds = 5 minutes
Fri Nov  8 16:20:59 CET 2013
Sleep 300 seconds = 5 minutes
Fri Nov  8 15:52:49 CET 2013
end of sleep

答案1

这听起来像是一个已经或正在将其良好级别设置为较低级别的过程。我会用以下命令确认这一点:

$ ps -eo "%p %y %x %c %n" | less

最后一列是良好值,在大多数情况下应为 0。如果它是 -20(最有利的调度)到 19(最有利的调度)之间的其他值,则某些东西正在将好值设置为这个不同的值。

例子

$ ps -eo "%p %y %x %c %n"| head -10
  PID TTY          TIME COMMAND          NI
    1 ?        00:00:01 init              0
    2 ?        00:00:00 kthreadd          0
    3 ?        00:00:02 ksoftirqd/0       0
    4 ?        00:00:03 migration/0       -
    5 ?        00:00:00 watchdog/0        -
   15 ?        00:00:06 events/0          0
   19 ?        00:00:00 cpuset            0
   20 ?        00:00:00 khelper           0
   21 ?        00:00:00 netns             0

其他事情

  1. 其他的东西@德罗伯特的指出。您的某些输出的时间出现奇怪的偏差。您的时钟可能有问题。

    具体来说这个块:

    Fri Nov  8 16:20:59 CET 2013
    Sleep 300 seconds = 5 minutes
    Fri Nov  8 15:52:49 CET 2013
    end of sleep
    

    看来我们在这里回到了过去!

  2. 评论中的一些人表示您的系统可能已进入睡眠状态或可能已休眠。这个想法似乎是最好的线索,因为sleep通常使用很少的 CPU 时间,正如@Gilles 在我的答案评论中所指出的那样,因此通常不会受到更改的良好级别的影响。

相关内容