为什么“uptime -s”输出不是恒定的?

为什么“uptime -s”输出不是恒定的?

我有 6 个 Raspberry Pi 3。Bash 脚本在其中 5 个上运行,但在 1 个上运行不了。

我使用uptime -s > file1[或-p,都试过了] 然后cp file1 file2在脚本的末尾。

10 分钟后,下次运行脚本时,我会执行uptime -s > file1并使用最后一个进行比较file2

我将其与以下内容进行file1比较file2

if [[ "$(cat file1)" != "$(cat file2)" ]]; then …

我每 10 分钟运行一次。每隔一段时间,我都会看到file1和的值file2 不同1秒,因此字符串比较测试失败。

这到底是怎么回事Pi?—其他 5 个工作正常。

有一个更好的方法吗?

答案1

先不论你的方法是否适合实现目标。可能的解释是:

strace uptime -s显示它读取/proc/uptime,我检查了 Debian 和 Raspbian。它似乎还读取当前时间(我不能确定,这是一个合理的猜测)并减去以得知系统在过去的什么时刻启动。

这两个读取事件之间有一定的间隔。无法保证每次运行命令时间隔都完全相同。因此减法结果会“浮动”一点。

然后以某种方式对该值进行舍入,因为最终输出需要提供整数秒数。舍入是“向下”还是“向上”或“向上一半”等并不重要。重要的是:舍入结果在某个小数部分会立即从“跳”NN+1。如果减法结果“浮动”在该临界值附近,您N有时会得到,N+1有时会得到。

碰巧你的一个树莓派在这么一瞬间启动了,它的uptime行为就是这样的,其他的就没有那么“幸运”了。任何在你重新启动之后,它们之中的任何一个都可能是“幸运的”,也可能不是。

我认为,如果您对您的系统施加压力并且设法uptime足够放慢执行速度,即使在其他五个 Raspberries 上您也会得到不同的结果。


还没有找到更好的方法来检测断电/重启。(...) 一定有更好的方法来做到这一点。这个东西里没有 RTC。

可以使用/etc/rc.local可能。它被设计为在系统启动时运行一次。

相关内容