richard84
2021年4月14日 15時53分
お世話になります。
Armadillo-IoT A6を用いて間欠動作によるデモシステムを作成しております。
デモシステムは、概略ですが以下の流れを考えております。
Sleep -> 起床(SMS/RTC/SW1) -> センサ値取得 -> クラウド送信 -> Sleep
上記のように起床をトリガにセンサ値取得動作をさせたいのですが、どのようにすれば良いでしょうか。
通常のブートですと、サービスとして自動起動させると思います(古いやり方だとrc.localとか)。
サービスとして何らかのプロセスを動かしておいて、タイマと"/sys/power/wakeup_count"を組み合わせれば実現できそうなイメージは持っております。
製品の特長からすると、何らかのやり方があると思っていますが、いかがでしょうか。
(製品マニュアルからは見つけられませんでした...)
以上、宜しくお願い致します。
コメント
richard84
吉田様
ご回答ありがとうございます。
(1)の手法については、動作させることができました。
(2)のsystemdを使用するやり方について、頂いたやり方をもとに試してみましたが確認できませんでした。
(すみません、以下ちょっと長いです)
> (2) systemd の機能を使用する。
> /lib/systemd/system/root-sleep.service を作成。
> (root として実行する場合この名前になります。他のユーザーとして実行する場合はファイル名が変わります。)
私のこれまでの理解ですと、ユニットファイル中に実行ファイル名を記述しますが、このやり方は、sleep動作前後で"/lib/systemd/system-sleep/"にあるスクリプトが自動的に実行されると理解しましたが、正しいでしょうか。
サービス定義後、起動しSleep=>SW1によるWakeupを行いましたが、実行結果が空でした。
なにか、設定が不足していますでしょうか。
・/lib/systemd/system-sleep/example.sh
root@armadillo:~# cat /lib/systemd/system-sleep/example.sh #!/bin/sh echo "Call example.sh..." case $1/$2 in pre/*) echo "hoge: Going to $2..." # ここに sleep に入る前に実行する処理を記載します。 /home/atmark/test/red_led_flash.sh ;; post/*) echo "hoge: Waking up from $2..." # ここに 起床後実行する処理を記載します。 /home/atmark/test/green_led_flash.sh ;; esac
・/lib/systemd/system/root-sleep.service
root@armadillo:~# cat /lib/systemd/system/root-sleep.service [Unit] Description=%I sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=-/usr/bin/systemctl stop %i ExecStop=-/usr/bin/systemctl start %i [Install] WantedBy=sleep.targetroot@armadillo:~# ls -l /lib/systemd/system/root-sleep.service -rw-r--r-- 1 root root 226 Apr 15 18:53 /lib/systemd/system/root-sleep.service
・journalctl -b -u systemd-suspendの実行
root@armadillo:~# [ 792.300638] fec 2188000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx journalctl -b -u systemd-suspend -- Logs begin at Thu 2019-02-14 19:12:00 JST, end at Mon 2021-04-19 22:07:48 JST -- No entries --
・systemctl status root-sleepの結果(参考)
root@armadillo:~# systemctl status root-sleep ● root-sleep.service - sleep hook Loaded: loaded (/lib/systemd/system/root-sleep.service; enabled; vendor prese Active: inactive (dead) Apr 19 22:00:13 armadillo systemd[1]: Stopped sleep hook. Apr 19 22:01:37 armadillo systemd[1]: Starting sleep hook... Apr 19 22:01:37 armadillo systemctl[762]: Failed to mangle name: Invalid argumen Apr 19 22:01:37 armadillo systemctl[762]: Failed to expand names: Invalid argume Apr 19 22:01:37 armadillo systemd[1]: Started sleep hook. Apr 19 22:01:37 armadillo systemd[1]: Stopping sleep hook... Apr 19 22:01:37 armadillo systemctl[763]: Failed to mangle name: Invalid argumen Apr 19 22:01:37 armadillo systemctl[763]: Failed to expand names: Invalid argume Apr 19 22:01:37 armadillo systemd[1]: root-sleep.service: Succeeded. Apr 19 22:01:37 armadillo systemd[1]: Stopped sleep hook.
以上、よろしくお願いします。
at_mitsuhiro.yoshida
richard84
at_mitsuhiro.yoshida
吉田です。
確認不足の内容が幾つかありました。
申し訳ありません。
まず、
> /lib/systemd/system/root-sleep.service を作成。
に関しては作成不要です。
Debian パッケージ ems31-uitls の aiot-sleep では、
echo mem > /sys/power/state
を実行することで Suspend-to-RAM 状態へ遷移しておりますが、
この処理 /usr/bin/aiot-sleep の 47行目 を
systemctl suspend
に書き換えていただき、aiot-sleep 実行後に、
root@armadillo:~# journalctl -b -u systemd-suspend
を実行いたしますと、実行結果が表示されるかと思われます。
ご確認よろしくお願いします。
richard84
at_keitaro.takahashi
アットマークテクノ高橋です。
2021/05/31実施の製品アップデートにて、
aiot-sleep 内で Suspend-to-RAM に遷移するコマンドを、デフォルトで
systemctl suspend
に変更しました。
これにより、 /lib/systemd/system-sleep/ に配置したスクリプトが自動で実行されるようになります。
詳細は
Armadillo 製品アップデートのお知らせ (2021年05月/Armadillo-IoT A6対象)
https://armadillo.atmark-techno.com/news/20210531/software-update-aiota6
及び、
Armadillo-IoT ゲートウェイ A6 製品マニュアル「7.5. スリープモードへの遷移・起床時にスクリプトを実行する」
https://manual.atmark-techno.com/armadillo-iot-a6/armadillo-iota6_produ…
をご確認ください。
at_mitsuhiro.yoshida
2021年4月15日 11時27分
吉田です。
今後 Howto などを充実させていきたいと考えております。
色々実現手段はあると思いますが、2 通り記載します。
1 つはそのまま処理を継続させる方法と、
もう 1 つは systemd の機能を使用する方法です。
(1) そのまま処理を継続する。
以下の様にスリープ実施後、起床時の動作を記載します。
(2) systemd の機能を使用する。
参考 URL:
- https://askubuntu.com/questions/226278/run-script-on-wakeup
- https://wiki.archlinux.org/index.php/Power_management#Hooks_in_.2Fusr.2…
例えば以下の様に設定します。
/lib/systemd/system-sleep/exsample.sh を作成(他のファイル名でも構いません。)
/lib/systemd/system-sleep/exsample.sh に実行権限を付与します。
/lib/systemd/system/root-sleep.service を作成。
(root として実行する場合この名前になります。他のユーザーとして実行する場合はファイル名が変わります。)
定義したサービスを起動します。
以下確認手順です。
Sleep します。
SW1 押すと起床します。
以下のコマンドを実施すると、実行結果が表示されます。