Armadilloフォーラム

間欠動作後のコンテナ起動について

new_bee

2023年7月27日 17時39分

いつもお世話になっております。

間欠動作にてsleepから60秒後に起動しその際に コンテナを起動しhuga.pyを実行するようにしたいです。

8.4. スリープ(SMS 起床可能)モードへの遷移と起床を参考にコンテナをスリープしRTCコマンドで60秒後に起動までは行えています。
方法をご教授いただけると助かります

コメント

アットマークテクノの古賀です。

new_beeさん:
>間欠動作にてsleepから60秒後に起動しその際に コンテナを起動しhuga.pyを実行するようにしたいです。
>
>8.4. スリープ(SMS 起床可能)モードへの遷移と起床を参考にコンテナをスリープしRTCコマンドで60秒後に起動までは行えています。
>方法をご教授いただけると助かります

おそらく、このフォーラムの、以下の質問スレッドが参考になるのではないかと思いますが、いかがでしょうか?
 https://armadillo.atmark-techno.com/forum/armadillo/15235

質問を拝見して想定した状況が実際と違っているかも知れませんので、いくつか確認させてください:

1.) 「コンテナをスリープし」とおっしゃっているのは、次のどれでしょうか?

 a.) コンテナ内で aiot-sleep-sms を実行する。

 b.) コンテナが起動した状態で、Base OS 上で aiot-sleep-sms を実行する。
   ←シェルのプロンプトが '[armadillo ~]# ` のようになっていれば、コンテナ内ではなく Base OS 上でコマンドを実行しています。

 c.) それ以外。

2.) 「60秒後に起動までは行えています」の起動というのは、次のどれを指しているでしょうか?

 A.) RTCアラーム割り込みで起床する。

 B.) RTCアラーム割り込みで起床後、コンテナを起動する。

 C.) それ以外。

3.) お使いのコンテナは、ご自分で作成されたコンテナでしょうか?あるいは、ゲートウェイコンテナでしょうか?

間欠動作を、huga.py を実行するコンテナの動作で実現するのであれば、「状態遷移トリガにコンテナ終了通知を利用する」で説明している手順を利用できます。
つまり、huga.py の実行が終了したら sleep して、60秒後に RTC アラーム割り込みで起床した際に、huga.py を実行するコンテナを起動する、という動作を実現できます。いかがでしょうか?

古賀さま

お世話になっております

> つまり、huga.py の実行が終了したら sleep して、60秒後に RTC アラーム割り込みで起床した際に、huga.py を実行するコンテナを起動する、という動作を実現できます。

この認識であっております。

1.私があまり理解できてないのですが プログラム実行完了時にA6E本体をsellp状態に移行できれば1.2どちらでも問題ないです

2. A .現段階ではA 起床後huga.pyを実行し再度スリープ一定時間後再度実行

3. atede上のvscode python new project で作成した コンテナになります

また、追加で質問なのですが、RTCアラーム2種類?などで同一コンテナで1分ごとにhuga.py 5分ごとにhoge.pyを実施することはできますでしょうか?

よろしくお願いいたします
> アットマークテクノの古賀です。
>
> new_beeさん:
> >間欠動作にてsleepから60秒後に起動しその際に コンテナを起動しhuga.pyを実行するようにしたいです。
> >
> >8.4. スリープ(SMS 起床可能)モードへの遷移と起床を参考にコンテナをスリープしRTCコマンドで60秒後に起動までは行えています。
> >方法をご教授いただけると助かります
>
> おそらく、このフォーラムの、以下の質問スレッドが参考になるのではないかと思いますが、いかがでしょうか?
>  https://armadillo.atmark-techno.com/forum/armadillo/15235
>
> 質問を拝見して想定した状況が実際と違っているかも知れませんので、いくつか確認させてください:
>
> 1.) 「コンテナをスリープし」とおっしゃっているのは、次のどれでしょうか?
>
>  a.) コンテナ内で aiot-sleep-sms を実行する。
>
>  b.) コンテナが起動した状態で、Base OS 上で aiot-sleep-sms を実行する。
>    ←シェルのプロンプトが '[armadillo ~]# ` のようになっていれば、コンテナ内ではなく Base OS 上でコマンドを実行しています。
>
>  c.) それ以外。
>
> 2.) 「60秒後に起動までは行えています」の起動というのは、次のどれを指しているでしょうか?
>
>  A.) RTCアラーム割り込みで起床する。
>
>  B.) RTCアラーム割り込みで起床後、コンテナを起動する。
>
>  C.) それ以外。
>
> 3.) お使いのコンテナは、ご自分で作成されたコンテナでしょうか?あるいは、ゲートウェイコンテナでしょうか?
>
>
> 間欠動作を、huga.py を実行するコンテナの動作で実現するのであれば、「状態遷移トリガにコンテナ終了通知を利用する」で説明している手順を利用できます。
> つまり、huga.py の実行が終了したら sleep して、60秒後に RTC アラーム割り込みで起床した際に、huga.py を実行するコンテナを起動する、という動作を実現できます。いかがでしょうか?

アットマークテクノの古賀です。

new_beeさん:
>>つまり、huga.py の実行が終了したら sleep して、60秒後に RTC アラーム割り込みで起床した際に、huga.py を実行するコンテナを起動する、という動作を実現できます。
>
>この認識であっております。

了解しました。以下の、確認のための質問への回答も有難うございます。

>1.私があまり理解できてないのですが プログラム実行完了時にA6E本体をsellp状態に移行できれば1.2どちらでも問題ないです
>
>2. A .現段階ではA 起床後huga.pyを実行し再度スリープ一定時間後再度実行
>
>3. atede上のvscode python new project で作成した コンテナになります

了解しました。であれば、先のコメントで紹介した、
 https://armadillo.atmark-techno.com/forum/armadillo/15235
の質問への回答に書いた手順が参考になると思います。

>また、追加で質問なのですが、RTCアラーム2種類?などで同一コンテナで1分ごとにhuga.py 5分ごとにhoge.pyを実施することはできますでしょうか?

ごめんなさい。間欠動作用のサービス(atmark-power-utils)だけでは、対応できません。

思いつく方策としては、コンテナ外の一時ファイルを使い、間欠動作の回数を記録して hoge.py を実行するかどうかを切り替える、というのがあります。
つまり、コンテナの実行コマンドとして huga.py や hoge.py を直接設定するのではなく、分岐用のスクリプトを実行コマンドにして、実行コマンドが、一時ファイルに記録・インクリメントするカウンタ値を見て、どちらを実行するかを切り替える、という方策です。
次のような感じです:

#!/bin/sh
 
COUNTER=/share/cnt
 
[ -e "$COUNTER" ] || echo 1 > "$COUNTER"
count=$(cat "$COUNTER")
 
if [ "$count" = 5 ]; then
    python3 hoge.py
    count=0
else
    python3 huga.py
fi
echo $((count + 1)) > "$COUNTER"

ここで、/share は、Base OS 上の一時ディレクトリを add_volumes でマウントしたディレクトリです。Base OS 上の一時ディレクトリを使うことで、間欠動作の sleep 前にコンテナが終了してもファイルが消えず、記憶域として利用できるというわけです。この設定については、たとえば、このフォーラムの、こちらのコメントが参考になるかと思います:
 https://armadillo.atmark-techno.com/forum/armadillo/16360#comment-13821

いかがでしょうか?もし参考になりましたら幸いです。

古賀さま
https://armadillo.atmark-techno.com/forum/armadillo/16360#comment-13821
上を参考に起動回数にて判定し実行ファイルを分けることができました。

コンテナ終了時から60秒後に起動?しているためプログラム実行時間ずつずれてしまいました。

例えば10分間隔で実行するためには、毎分起動しアルマジロの本体の時間で判定するか、毎回RTCを変更するしかないのでしょうか?

それ以外に方法がもしございましたらご教授いただけると助かります

> アットマークテクノの古賀です。
>
> new_beeさん:
> >>つまり、huga.py の実行が終了したら sleep して、60秒後に RTC アラーム割り込みで起床した際に、huga.py を実行するコンテナを起動する、という動作を実現できます。
> >
> >この認識であっております。
>
> 了解しました。以下の、確認のための質問への回答も有難うございます。
>
> >1.私があまり理解できてないのですが プログラム実行完了時にA6E本体をsellp状態に移行できれば1.2どちらでも問題ないです
> >
> >2. A .現段階ではA 起床後huga.pyを実行し再度スリープ一定時間後再度実行
> >
> >3. atede上のvscode python new project で作成した コンテナになります
>
> 了解しました。であれば、先のコメントで紹介した、
>  https://armadillo.atmark-techno.com/forum/armadillo/15235
> の質問への回答に書いた手順が参考になると思います。
>
> >また、追加で質問なのですが、RTCアラーム2種類?などで同一コンテナで1分ごとにhuga.py 5分ごとにhoge.pyを実施することはできますでしょうか?
>
> ごめんなさい。間欠動作用のサービス(atmark-power-utils)だけでは、対応できません。
>
> 思いつく方策としては、コンテナ外の一時ファイルを使い、間欠動作の回数を記録して hoge.py を実行するかどうかを切り替える、というのがあります。
> つまり、コンテナの実行コマンドとして huga.py や hoge.py を直接設定するのではなく、分岐用のスクリプトを実行コマンドにして、実行コマンドが、一時ファイルに記録・インクリメントするカウンタ値を見て、どちらを実行するかを切り替える、という方策です。
> 次のような感じです:
>

> #!/bin/sh
> 
> COUNTER=/share/cnt
> 
> [ -e "$COUNTER" ] || echo 1 > "$COUNTER"
> count=$(cat "$COUNTER")
> 
> if [ "$count" = 5 ]; then
>     python3 hoge.py
>     count=0
> else
>     python3 huga.py
> fi
> echo $((count + 1)) > "$COUNTER"
> 

>
> ここで、/share は、Base OS 上の一時ディレクトリを add_volumes でマウントしたディレクトリです。Base OS 上の一時ディレクトリを使うことで、間欠動作の sleep 前にコンテナが終了してもファイルが消えず、記憶域として利用できるというわけです。この設定については、たとえば、このフォーラムの、こちらのコメントが参考になるかと思います:
>  https://armadillo.atmark-techno.com/forum/armadillo/16360#comment-13821
>
>
> いかがでしょうか?もし参考になりましたら幸いです。

アットマークテクノの古賀です。

new_beeさん:
>コンテナ終了時から60秒後に起動?しているためプログラム実行時間ずつずれてしまいました。

/etc/conf.d/power-utils.conf の設定により、コンテナ終了通知を電源状態遷移トリガにして間欠動作する場合、コンテナ終了時に起床までの時間をセットしますので、起床までの時間よりも起床間隔が大きくなり、おっしゃるように、そのぶんずれますね。
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

>例えば10分間隔で実行するためには、毎分起動しアルマジロの本体の時間で判定するか、毎回RTCを変更するしかないのでしょうか?
>
>それ以外に方法がもしございましたらご教授いただけると助かります

プログラムの定期実行ですが、省電力用の間欠動作との組み合わせが必須でしょうか?
省電力動作が必須ではなく、単に一定間隔でプログラムを実行できればよいのであれば、コンテナで実行するスクリプトでタイミング合わせを行うのが簡単です。

省電力動作が必須な場合、定期実行の間隔と時間精度がどの程度かで実現容易性ないし可否が変わります。
定期実行の間隔と時間精度(例:分単位で十分、秒単位の精度が必要、など)と、省電力が必須かどうかを教えて頂けますか。また、動かそうとなさっているプログラムの実行時間が固定なのか、あるいは、ネットワークなどの環境の変動により、秒以上の単位で実行時間が変動し得るのかも教えてくださいませ。

古賀様

お世話になっております

間欠動作は必要で、カメラから画像を取得している関係で実行時間は秒単位で前後変動いたします。
実行タイミングは分単位での制度があれば十分です。

そのため現在はシェルにて一分ごとのコンテナ起動時間での判定を行っております。

よろしくお願いいたします。

> アットマークテクノの古賀です。
>
> new_beeさん:
> >コンテナ終了時から60秒後に起動?しているためプログラム実行時間ずつずれてしまいました。
>
> /etc/conf.d/power-utils.conf の設定により、コンテナ終了通知を電源状態遷移トリガにして間欠動作する場合、コンテナ終了時に起床までの時間をセットしますので、起床までの時間よりも起床間隔が大きくなり、おっしゃるように、そのぶんずれますね。
>  https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
>
> >例えば10分間隔で実行するためには、毎分起動しアルマジロの本体の時間で判定するか、毎回RTCを変更するしかないのでしょうか?
> >
> >それ以外に方法がもしございましたらご教授いただけると助かります
>
> プログラムの定期実行ですが、省電力用の間欠動作との組み合わせが必須でしょうか?
> 省電力動作が必須ではなく、単に一定間隔でプログラムを実行できればよいのであれば、コンテナで実行するスクリプトでタイミング合わせを行うのが簡単です。
>
> 省電力動作が必須な場合、定期実行の間隔と時間精度がどの程度かで実現容易性ないし可否が変わります。
> 定期実行の間隔と時間精度(例:分単位で十分、秒単位の精度が必要、など)と、省電力が必須かどうかを教えて頂けますか。また、動かそうとなさっているプログラムの実行時間が固定なのか、あるいは、ネットワークなどの環境の変動により、秒以上の単位で実行時間が変動し得るのかも教えてくださいませ。

アットマークテクノの古賀です。

new_beeさん:
>間欠動作は必要で、カメラから画像を取得している関係で実行時間は秒単位で前後変動いたします。
>実行タイミングは分単位での制度があれば十分です。

了解しました。間欠動作が必須で、定期動作の周期の最小単位が分ということであれば、

>そのため現在はシェルにて一分ごとのコンテナ起動時間での判定を行っております。

という方策が妥当だと思います。

>>>コンテナ終了時から60秒後に起動?しているためプログラム実行時間ずつずれてしまいました。
>>
>>/etc/conf.d/power-utils.conf の設定により、コンテナ終了通知を電源状態遷移トリガにして間欠動作する場合、コンテナ終了時に起床までの時間をセットしますので、起床までの時間よりも起床間隔が大きくなり、おっしゃるように、そのぶんずれますね。
>> https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

ずれが起きる要因としては、プログラム実行時間(起動から自発終了するまでの時間)に加え、Base OS が起床してプログラムが起動するまでの時間(コンテナの起動に要する時間)、および、RTC 割り込みの時間精度によるずれがあります。
割合としては、RTC 割り込みの時間精度によるずれの方が大きいと思われます:
 https://armadillo.atmark-techno.com/forum/armadillo/14044#comment-12376

>>>例えば10分間隔で実行するためには、毎分起動しアルマジロの本体の時間で判定するか、毎回RTCを変更するしかないのでしょうか?
>>>
>>>それ以外に方法がもしございましたらご教授いただけると助かります

ということで、現状では、他に方法がないです。ごめんなさい。

スリープからの起床要因に RTC 割り込みを使う場合に、RTC モジュールのアラーム割り込みの代わりに、SoC の内蔵 RTC のアラーム割り込みを使用できるようにすれば、時間精度が秒単位になりますので、間欠動作の周期精度を上げられると思います。しかし、現状は対応していません。

古賀様

回答ありがとうございます。

プログラム実行以外にもいろいろ原因あったのですね

また何かありましたらよろしくお願いいたします

ありがとうございました

> アットマークテクノの古賀です。
>
> new_beeさん:
> >間欠動作は必要で、カメラから画像を取得している関係で実行時間は秒単位で前後変動いたします。
> >実行タイミングは分単位での制度があれば十分です。
>
> 了解しました。間欠動作が必須で、定期動作の周期の最小単位が分ということであれば、
>
> >そのため現在はシェルにて一分ごとのコンテナ起動時間での判定を行っております。
>
> という方策が妥当だと思います。
>
> >>>コンテナ終了時から60秒後に起動?しているためプログラム実行時間ずつずれてしまいました。
> >>
> >>/etc/conf.d/power-utils.conf の設定により、コンテナ終了通知を電源状態遷移トリガにして間欠動作する場合、コンテナ終了時に起床までの時間をセットしますので、起床までの時間よりも起床間隔が大きくなり、おっしゃるように、そのぶんずれますね。
> >> https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
>
> ずれが起きる要因としては、プログラム実行時間(起動から自発終了するまでの時間)に加え、Base OS が起床してプログラムが起動するまでの時間(コンテナの起動に要する時間)、および、RTC 割り込みの時間精度によるずれがあります。
> 割合としては、RTC 割り込みの時間精度によるずれの方が大きいと思われます:
>  https://armadillo.atmark-techno.com/forum/armadillo/14044#comment-12376
>
> >>>例えば10分間隔で実行するためには、毎分起動しアルマジロの本体の時間で判定するか、毎回RTCを変更するしかないのでしょうか?
> >>>
> >>>それ以外に方法がもしございましたらご教授いただけると助かります
>
> ということで、現状では、他に方法がないです。ごめんなさい。
>
> スリープからの起床要因に RTC 割り込みを使う場合に、RTC モジュールのアラーム割り込みの代わりに、SoC の内蔵 RTC のアラーム割り込みを使用できるようにすれば、時間精度が秒単位になりますので、間欠動作の周期精度を上げられると思います。しかし、現状は対応していません。