我有 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。它似乎还读取当前时间(我不能确定,这是一个合理的猜测)并减去以得知系统在过去的什么时刻启动。
这两个读取事件之间有一定的间隔。无法保证每次运行命令时间隔都完全相同。因此减法结果会“浮动”一点。
然后以某种方式对该值进行舍入,因为最终输出需要提供整数秒数。舍入是“向下”还是“向上”或“向上一半”等并不重要。重要的是:舍入结果在某个小数部分会立即从“跳”N
到N+1
。如果减法结果“浮动”在该临界值附近,您N
有时会得到,N+1
有时会得到。
碰巧你的一个树莓派在这么一瞬间启动了,它的uptime
行为就是这样的,其他的就没有那么“幸运”了。任何在你重新启动之后,它们之中的任何一个都可能是“幸运的”,也可能不是。
我认为,如果您对您的系统施加压力并且设法uptime
足够放慢执行速度,即使在其他五个 Raspberries 上您也会得到不同的结果。
还没有找到更好的方法来检测断电/重启。(...) 一定有更好的方法来做到这一点。这个东西里没有 RTC。
可以使用/etc/rc.local
可能。它被设计为在系统启动时运行一次。