【问题标题】:Sleeping for certain numbers lasts forever in Linux bash在 Linux bash 中,为某些数字休眠会永远持续下去
【发布时间】:2013-05-06 04:18:33
【问题描述】:

我正在 Ubuntu 13.04 中编写一个 bash 脚本,它需要 sleep 参数传递的特定秒数。 我已确保 sleep 允许在文档中查找浮点数:

与大多数要求 NUMBER 为整数的实现不同,这里的 NUMBER 可以是任意浮点数。

确实它适用于某些值。例如,“0.1”、“0.01”、“0.02”、“0.03”或“0.4”是可以的,但对于“0.04”或“0.05”等其他值则永久有效。

我的意思是, 这将起作用:

sleep 0.03

...但这将永远持续下去:

sleep 0.04

有人知道为什么吗?

谢谢!

【问题讨论】:

  • 如果你使用“env sleep”而不是“sleep”会发生什么?
  • 您是否调用了另一个终端并运行 top 和 ps 以查看发生了什么?您可能还希望将其作为可能的 Ubuntu 错误或问题放在启动板中。我已经在 12.04 上尝试过,并且 sleep 0.04 有效。所以,这可能是 Ubuntu 中的一个错误。
  • 此处不可重现,我在sleep 的任何值都按预期工作。
  • env sleep 也挂起。我已经在 12.10 中尝试过它并且它可以工作,确实它看起来像一个 13.04 错误
  • 尝试运行strace sleep 0.04

标签: linux bash ubuntu floating-point sleep


【解决方案1】:

这可能是 sleep 命令的错误...

在修复该错误之前,您也可以使用 bash 实现,在您的脚本上创建此别名,但如果您想模拟所有功能,请参阅 sleep --help

alias sleep='read -t'

现在试试吧:

date +"%S.%N"; sleep 0.04; date +"%S.%N";

这已经在 ubuntu 12.10 上运行了。

编辑:这不太精确,但如果您不需要 sleep 命令的额外功能,也可以:

function FUNCsleep() { 
  local delay=$1;
  local beginAt=`date +"%s.%N"`;
  while true; do 
    local now=`date +"%s.%N"`;
    if((`echo "($now-$beginAt)>=$delay" |bc -l`==1));then 
      break;
    fi;
  done;
}
alias sleep='FUNCsleep'

【讨论】:

  • @user1031431 正如您在评论中所说的它可以在另一台 13.10 机器上运行,您应该检查 sleep --version(我的是 8.13)。除了可能的差异之外,我猜你的硬件有问题。但是由于 3 ppl(直到现在)对您的问题投了赞成票,我也可以考虑一个错误的 cpu 版本,但这可能是太多的猜测......
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2013-02-19
  • 2020-01-01
相关资源
最近更新 更多