Armadilloフォーラム

特定の時間にpodmanコンテナ内の.pyを自動起動する方法について

yuki.shigefuji

2023年4月3日 11時16分

お世話になっております。
毎日0時に特定のpodmanコンテナ内のdelete_videos.pyというファイルを起動したいと考えております。
そこで/etc/init.d/下にdelete_videosを作成し以下のようにし、/etc/crontabs/rootにrun-partsとして登録しpersist_fileを行いました。
しかし0時になっても起動せず悩んでおります。
自動的に特定のPGをpodmanコンテナ内で実行する方法を教えていただければと思います。
ご確認よろしくお願いいたします。

case "$1" in
start)
# 0....................................
sleep $(($(date -d 'tomorrow 0:00:00 UTC' +%s) - $(date +%s)))
podman exec -it taksys python3 delete_videos.py
;;
*)
echo "Usage: $0 {start}" >&2
exit 3
;;
esac

コメント

at_dominique.m…

2023年4月3日 11時42分

yuki.shigefuji さん、

お世話になっています、
アットマークテクノのマルティネです。

> 毎日0時に特定のpodmanコンテナ内のdelete_videos.pyというファイルを起動したいと考えております。
> そこで/etc/init.d/下にdelete_videosを作成し以下のようにし、/etc/crontabs/rootにrun-partsとして登録しpersist_fileを行いました。
> しかし0時になっても起動せず悩んでおります。

Armadillo Base OS では crond が起動していませんので、/etc/crontabs に登録しても実行されないですね。
サービスとしては busybox が提供していますので、有効してしまえば( rc-update add crond && persist_file -v /etc/runlevels/default/crond )起動されると思いますが、
コンテナで実行したい物はコンテナで実行すればいいと思いますので、
コンテナ内に crond を起動させてそちらの crontab を使えばいかがでしょうか?

実行方法は具体的なコンテナとすでに実行されているコマンドによりますので、教えていただけたら手順を用意できます。

> # 0....................................
> sleep $(($(date -d 'tomorrow 0:00:00 UTC' +%s) - $(date +%s)))

(ちなみに cron内に実行してほしい時間を指定しない理由はありますか?コメントが表示されてなかったので、ここの sleep のメリットは分かりませんでした。)

よろしくお願いします。

yuki.shigefuji

2023年4月3日 16時59分

お世話になっております。

現在コンテナ内で起動するために設定しているのですが、
起動する物はコンテナ内の/sys/delete_videos.py
コンテナ内でcrontab -eで下記のように記載しているのですが実行されておりません。
date コマンドで23:59に設定し一分後0:00になった時実行されるものと思っているのですが如何でしょうか


#!/usr/bin/env python3
0 0 * * * python3 /sys/delete_videos.py

at_dominique.m…

2023年4月3日 18時25分

yuki.shigefujiさん、

> 現在コンテナ内で起動するために設定しているのですが、
> 起動する物はコンテナ内の/sys/delete_videos.py
> コンテナ内でcrontab -eで下記のように記載しているのですが実行されておりません。

すみません、私の返事が分かりにくかったです。
コンテナでも crond が起動されていないと思います。

どのイメージを使っていますでしょうか?また、set_command でコマンドを指定していると思いますが、そうでしょうか?(コマンドを変更する形になると思いますので、具体的な引数じゃなくてもコマンドの形を教えてくださればその内容を維持します)

イメージによって、起動方法が変わりますので教えていただけたら crond の起動方法を説明します。

よろしくお願いします。

yuki.shigefuji

2023年4月4日 8時56分

set_command weston --tty=7
セットコマンドは上記のものを使っております。
マニュアル第9章Howtoのデモアプリケーションのイメージをカスタムして現在は使っております。
求められている情報かは不確かですが、ご確認よろしくお願いいたします。

at_dominique.m…

2023年4月4日 9時33分

yuki.shigefujiさん、

マルティネです。

> set_command weston --tty=7
> セットコマンドは上記のものを使っております。
> マニュアル第9章Howtoのデモアプリケーションのイメージをカスタムして現在は使っております。

了解しました。

デフォルトの状態のコンテナでは cron のプログラムもインストールされてませんので、まずは追加します。
すでにカスタムしていますので自由な方法で構いませんが、例のためは podman build を使ってビルドします。podman commit を使えたらそれでもいいです。

テストのためには毎分時間を /tmp/ran_cron に記載させます。「debian-cron」は自分のイメージネームを任意に入れてください。

armadillo:~# cat > build_cron.Dockerfile <<EOF
FROM localhost/at-debian-image:latest
RUN apt update && apt install --no-install-recommends -y cron
RUN echo "* * * * * root date > /tmp/ran_cron" >> /etc/crontab
EOF
armadillo:~# podman build -t debian-cron:latest -f build_cron.Dockerfile

/etc/atmark/containers/ のコンフィグファイルの方は、そのイメージを使って cron コマンドを実行させます:

armadillo:~# vi /etc/atmark/containers/cron.conf
set_image debian-cron
...(省略)
set_command sh -c 'cron & exec weston --tty 7'

これで podman_start cron で実行したら、cron のプロセスが実行されていて、/tmp/ran_cron を確認したら実行されています。
コンテナから /etc/crontab を変数するなり、crontab -e を使って /var/spool/cron/crontabs/<user> を作成しても cron が自動的に読んでますので、問題なく使えると思います。

実行方法だけ少しややっこしいですが、よろしければ使ってください。

yuki.shigefuji

2023年4月4日 14時00分

お世話になっております。
ありがとうございます。

まだ未実施ですが試します。
別件のご質問なのですが、ネットワークから時刻を取得せずローカルのみで電源が落ちても保持してリアルタイムの時計と同等の時間を維持することは可能なのでしょうか。
出来ればサーバーからの取得ではない方法で保持したく考えております。ご確認よろしくお願いいたします。

at_dominique.m…

2023年4月4日 14時17分

yuki.shigefujiさん

マルティネです。

> まだ未実施ですが試します。

了解です。問題あったらまた聞いてください。

> 別件のご質問なのですが、ネットワークから時刻を取得せずローカルのみで電源が落ちても保持してリアルタイムの時計と同等の時間を維持することは可能なのでしょうか。
> 出来ればサーバーからの取得ではない方法で保持したく考えております。ご確認よろしくお願いいたします。

Armadillo IoT G4 に外部の RTC が搭載されています。 CON13 にコイン電池(CR2032、BR2032等)を入れると、ネットワークがなくても時間を維持できると思います。
電池を入れない場合はコンデンサーに残っている電源で数秒は持ちますが(温度等によりますが、今電源を15秒抜いても持ちました)、ネットワークを使わない予定でしたら電池を使うことをおすすめします。

なお、デフォルト状態では Armadillo Base OS の方で ntp を取得しています。単純にネットワークに接続しないのであればデフォルト状態でも問題ありませんが、あえてネットワーク取得をさせたくない場合は chronyd を無効化してください。(persist_file -d /etc/runlevels/default/chronyd)

よろしくお願いします。