Armadilloフォーラム

python3から本体電源OFF

uen2825

2023年8月18日 9時28分

いつもフォーラムを参考にしています。
python3からA6E本体の電源を落としたいです。
流れは
1. A6E本体電源ON
2. a6e-gw-container.confからpython3プログラムを実行
3. RS485から特定の文字が入ったらA6E本体の電源を落としたい
 ここでpython3のプログラムに外部コマンドを実行する関数を入れています
  subprocess.run("poweroff")

コンテナからは抜けている感じですが、A6E本体の電源が落とせません。
A6E本体の電源を落とすやり方など、アドバイスを頂けたら幸いです。

コメント

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

uen2825さん:
>いつもフォーラムを参考にしています。

有難うございます。

>python3からA6E本体の電源を落としたいです。
>流れは
>1. A6E本体電源ON
>2. a6e-gw-container.confからpython3プログラムを実行
>3. RS485から特定の文字が入ったらA6E本体の電源を落としたい
> ここでpython3のプログラムに外部コマンドを実行する関数を入れています
>  subprocess.run("poweroff")
>
>コンテナからは抜けている感じですが、A6E本体の電源が落とせません。

コンテナ内で poweroff を実行しても、ホスト OS の電源オフ動作は実行されないのです。

>A6E本体の電源を落とすやり方など、アドバイスを頂けたら幸いです。

以下にコメントします。

>a6e-gw-container.confからpython3プログラムを実行

とのことですから、a6e-gw-container.conf の set_command 行を書き換えて、自作された python プログラを実行するようにしていらっしゃるのだと思います。つまり、ゲートウェイコンテナの .conf ファイルをお使いとのことですので、マニュアルの「状態遷移トリガにコンテナ終了通知を利用する」で説明している、間欠動作用の仕組みを流用するのが簡単です:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

間欠動作用の仕組みを流用して、コンテナの終了時に電源オフする方法を述べます。Base OS の /etc/containers/aiot_gw_container_hooks.d/ ディレクトリにある hook.sh を書き換えることで、上記 3 のタイミングで、pyton プログラムで sys.exit() を実行して自発終了した時に、コンテナの終了をトリガとして、ホスト OS (Base OS) の電源オフ動作を実行できます。

#!/bin/sh
 
#/usr/bin/pwu_notify container_stop  ★この行をコメントアウト
/sbin/poweroff

上でコメントアウトした行は、間欠動作用に atmark-power-utils サービスにコンテナの終了通知を行うためのものですが、間欠動作を行わず、単に 電源オフ動作をしたいだけの場合は、/sbin/poweroff を実行するように書き換えればよいです。
なお、書き換えた後は、persist_file コマンドを使って、hook.sh ファイルの変更内容を永続化してください:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

以上、参考になりましたら幸いです。

アットマークテクノ 古賀様

ご説明通り試したところ、希望する動きになりました。
早急なご対応ありがとうございました。

アットマークテクノ 古賀様
お世話になります。
追加で質問させてください。
コンテナを抜けた際のシャットダウンはこちらで教えて頂きましたが
起動時の信号によってSLEEPモードにしたい場合もあります。
シャットダウンとSLEEPモードを変更する方法を教えてください。

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

uen2825さん:
>追加で質問させてください。
>コンテナを抜けた際のシャットダウンはこちらで教えて頂きましたが
>起動時の信号によってSLEEPモードにしたい場合もあります。
>シャットダウンとSLEEPモードを変更する方法を教えてください。

このフォーラムで別の方から頂いた質問に対する、以下のコメントと同じ方策をお使い頂くのがよいかと思います:
 https://armadillo.atmark-techno.com/forum/armadillo/15235#comment-13117

/etc/atmark//containers/ に配置するコンテナの .conf ファイルに、「起動時の信号により、hook.sh の内容を poweroff にするか aiot-sleep にするかを書き換える」という動作を追加してみてくださいませ。

以上、参考になりましたら幸いです。

古賀様
ご回答ありがとうございます。
質問に間違いがございました。
> >起動時の信号によってSLEEPモードにしたい場合もあります。
> >シャットダウンとSLEEPモードを変更する方法を教えてください。
コンテナ内でpythonを実行させ、RS485の通信結果によりシャットダウンとSLEEPモードを変更させたい。でした。
申し訳ございません。
今試している作業ですが
コンテナの外にフラグファイルを用意して0:シャットダウン 1:SLEEPモードとしました。
/etc/containers/aiot_gw_container_hooks.d/hook.shは
#!/bin/sh
A=`cat /var/app/rollback/volumes/gw_container/src/off_flg.txt`
if [$1 = ${A})
/usr/bin/pwu_notify container_stop
else
/sbin/poweroff
fi

/etc/atmark/power-utils.confは
TARGET='a6e-gw-container'
MODE='SLEEP'
WAKEUP='SW1', 'USB', 'UART', 'GPIO', 'SMS'

また教えて頂けないでしょうか

古賀様
解決いたしました。
shell文に間違いがございました。
#!/bin/sh
flg = "cat/var/app/rollback/volumes/gw_container/src/off_flg.txt"
if [$1 = $flg]; then
/sbin/poweroff
else
/usr/bin/pwu_notify container_stop
fi

ありがとうございました。