Armadilloフォーラム

aiot-alarm-poweroff コマンドで、数十秒で再起動がかかる場合がある

manabu-yoshioka-arc

2025年3月28日 12時11分

==========
製品型番:armadillo-iot-a6
Debian/ABOSバージョン:Linux armadillo 4.14-at65 #1 Mon Jan 29 14:43:02 JST 2024 armv7l GNU/Linux
カーネルバージョン:4.14-at65
3G/LTE モジュール情報 (Debianのみ):
その他:
==========

ソーラーパネル+バッテリーを使った機器で、armadillo-iot-a6 を利用したシステム開発を行っています。
可能な限り省電力を実現したく、aiot-alarm-poweroff コマンドを使った間欠運転の実験をしています。

下記のようなスクリプトで動作検証を行いました。

sleep 150	# 電源ON後、通信が確立するまでの時間調整
$BIN_DIR/rebootReporter 1>/dev/null 2>/dev/null &  # リブートをサーバに通知
$BIN_DIR/reportCondition 1>/dev/null 2>/dev/null & # 状態をサーバーに通知
sleep 30
 
# 次の10分後まで電源断 (sleep(150+30)での3分はここまで経過)
CurrentTime=`date +%s`
Next10minutesEveryHour=$(( (CurrentTime / 60 + 7) * 60 )) - 30
Next10minutesTime=`date +%s --date @$Next10minutesEveryHour`
RemainSecsUntilNext10minutesTime=$(( Next10minutesTime - CurrentTime ))
if [ "$RemainSecsUntilNext10minutesTime" -lt 180 ]; then
    RemainSecsUntilNext10minutesTime=180
fi
sudo aiot-alarm-poweroff +$RemainSecsUntilNext10minutesTime

サーバー側の記録の一部を下記に記載します。

"#912 45.2KP","2025-03-28 01:50:48",リブート → 差分: 420秒
"#912 45.2KP","2025-03-28 01:57:48",リブート → 差分: 420秒
"#912 45.2KP","2025-03-28 01:58:35",リブート → 差分: 47秒
"#912 45.2KP","2025-03-28 02:04:48",リブート → 差分: 373秒
"#912 45.2KP","2025-03-28 02:11:48",リブート → 差分: 420秒
"#912 45.2KP","2025-03-28 02:18:48",リブート → 差分: 420秒
"#912 45.2KP","2025-03-28 02:25:49",リブート → 差分: 421秒

まず、10分間隔での再起動を目指していたのですが、スクリプトの sleep 命令はそこで待つのではなく、そのまま先に実行が進むようで、7分の追加ではなく、10分の時間追加にすべきというのは私の側のミスだというのはわかりました。

質問は、途中の 47 秒でのリブート、その後の 373 秒のリブートです。
47 + 373 = 420 になるので、足すと 420 秒になっています。

この症状について、何か考えられることがあればコメントをお願いします。
秒数とターミナルから見て、
$BIN_DIR/rebootReporter 1>/dev/null 2>/dev/null & # リブートをサーバに通知
部分での、スクリプトがもう一度走っているのか、あるいは リブートの通信 (curl を使用してのhttp通信)でのリトライかもしれませんが。

よろしくお願いします。

コメント

manabu-yoshioka-arc

2025年3月28日 17時21分

先の質問で、`aiot-alarm-poweroff +180以上` を指定しているのに、数十秒後にリブートしている、はリブートをレポートする curl プログラムの再送信でした。申し訳ございません。こちらの質問は、取り下げさせていただきます。

残りの質問は、以下です。お手数ですがアドバイスいただけると助かります。
スクリプトは先にも書いたように

sleep 150	# 電源ON後、通信が確立するまでの時間調整
$BIN_DIR/rebootReporter 1>/dev/null 2>/dev/null &  # リブートをサーバに通知
$BIN_DIR/reportCondition 1>/dev/null 2>/dev/null & # 状態をサーバーに通知
sleep 30
 
# 次の10分後まで電源断 (sleep(150+30)での3分はここまで経過)
CurrentTime=`date +%s`
Next10minutesEveryHour=$(( (CurrentTime / 60 + 7) * 60 )) - 30
Next10minutesTime=`date +%s --date @$Next10minutesEveryHour`
RemainSecsUntilNext10minutesTime=$(( Next10minutesTime - CurrentTime ))
if [ "$RemainSecsUntilNext10minutesTime" -lt 180 ]; then
    RemainSecsUntilNext10minutesTime=180
fi
sudo aiot-alarm-poweroff +$RemainSecsUntilNext10minutesTime

です。sleep で 計 180 秒待たせているので、10分毎にリブートしようとしていて残りの7分 420秒相当

aiot-alarm-poweroff +420

を実行しています。
ところが、実際のリブートの様子を見ていると 7分単位でのリブートとなっています。

簡単なテストで以下もしてみました。

arcnohara@armadillo:~$ date
Fri Mar 28 17:03:25 JST 2025
arcnohara@armadillo:~$ sleep 120
arcnohara@armadillo:~$ date
Fri Mar 28 17:05:31 JST 2025
arcnohara@armadillo:~$ 

やはり sleep 経過後の date コマンドは2分経過した値が返ってきています。

スクリプトでも試してみました。

#!/bin/bash
 
CurrentTime=`date +%s`
echo $CurrentTime
sleep 120
CurrentTime=`date +%s`
echo $CurrentTime

結果は

arcnohara@armadillo:~$ bash test.sh 
1743148773
1743148893

で、おおよそ 120秒の経過タイムになっています。

つまり私の実行しているスクリプトでは、sleep の経過時間が CurrentTime に含まれず、無視されているような挙動となっています。
間違いの指摘、テスト項目のアドバイスなど頂けましたら、助かります。

at_shota.shimoyama

2025年3月28日 17時36分

アットマークテクノの下山です。

提示していただいたプログラムを参考にこちらでも実行してみましたが、しっかり10分後に起床しました。

ちなみにですが、

Next10minutesEveryHour=$(( (CurrentTime / 60 + 7) * 60 )) - 30

Next10minutesEveryHour=$(( (CurrentTime / 60 + 7) * 60 - 30))

の間違いではないでしょうか?
前者の方だとエラーが出力されました。

また、sleepが無視されるような挙動についてですが、

sleep 150	# 電源ON後、通信が確立するまでの時間調整

の部分で何かしらの理由でエラーが発生していてスキップしているのかもしれません。
試しにコメントの部分を消してみていただけますでしょうか?

もしそれでもダメであれば、

sudo aiot-alarm-poweroff +$RemainSecsUntilNext10minutesTime

の部分をコメントアウトして、徐々に原因を切り分けていくしかないと思います。

よろしくお願いします。

manabu-yoshioka-arc

2025年3月28日 20時35分

下山様、コメントありがとうございました。

いただいたコメントを読んで、もう一度よくコードを見てみました。
申し訳ございません、実機で試しているコードの書き損じ、タイプミスでした。
また、何を考えていたのか、変な計算をさせようとしていて、

SomeCommand
sleep 180
suso aiot-alarm-poweroff +420

とすれば良いのだということにも気づきました。お恥ずかしい限りです。
ありがとうございました。