У меня есть 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 сек, таким образом, тест сравнения строк завершается неудачей.

Что в мире происходит с этим одним Пи? - остальные 5 работают нормально.

Есть лучший способ сделать это?

1 ответ1

1

Отложите, если ваш путь - это хороший способ сделать то, чего вы хотите достичь. Возможное объяснение:

strace uptime -s показывает, что он читает /proc/uptime , я проверил на Debian и Raspbian. Кажется, он также читает текущее время (я не могу сказать наверняка, это разумное предположение) и вычитает, чтобы сказать, в какой момент в прошлом система была запущена.

Эти два события чтения разделены некоторым интервалом. Нет никакой гарантии, что интервал будет одинаковым при каждом запуске команды. Так что результат вычитания будет немного "плавать".

Затем это значение как-то округляется, потому что конечный результат должен содержать целое число секунд. Не имеет значения, является ли округление "вниз" или "вверх", или "наполовину" и т.д. Что имеет значение: есть определенная дробная часть, где результат округления "скачет" мгновенно с N до N+1 . Если результат вычитания "плавает" вблизи этого критического значения, вы получите N иногда, N+1 другой раз.

Случайно одна из ваших Raspberry была запущена в такие доли секунды, uptime ее работы ведет себя так, а другим не повезло. Любой из них может быть или не быть "счастливчиком" после перезагрузки.

Я думаю, что если бы вы напрягли свои системы и сумели достаточно замедлить uptime , вы бы получили другие результаты даже на этих пяти других Raspberry.


Не нашли лучшего способа обнаружить потерю питания / перезагрузку. (...) Должен быть лучший способ сделать это. Нет RTC в этой вещи.

Возможно, поработайте с /etc/rc.local . Он предназначен для запуска всего один раз при запуске системы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .