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
コメント
yuki.shigefuji
at_dominique.m…
yuki.shigefujiさん、
> 現在コンテナ内で起動するために設定しているのですが、
> 起動する物はコンテナ内の/sys/delete_videos.py
> コンテナ内でcrontab -eで下記のように記載しているのですが実行されておりません。
すみません、私の返事が分かりにくかったです。
コンテナでも crond が起動されていないと思います。
どのイメージを使っていますでしょうか?また、set_command でコマンドを指定していると思いますが、そうでしょうか?(コマンドを変更する形になると思いますので、具体的な引数じゃなくてもコマンドの形を教えてくださればその内容を維持します)
イメージによって、起動方法が変わりますので教えていただけたら crond の起動方法を説明します。
よろしくお願いします。
yuki.shigefuji
at_dominique.m…
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
at_dominique.m…
yuki.shigefujiさん
マルティネです。
> まだ未実施ですが試します。
了解です。問題あったらまた聞いてください。
> 別件のご質問なのですが、ネットワークから時刻を取得せずローカルのみで電源が落ちても保持してリアルタイムの時計と同等の時間を維持することは可能なのでしょうか。
> 出来ればサーバーからの取得ではない方法で保持したく考えております。ご確認よろしくお願いいたします。
Armadillo IoT G4 に外部の RTC が搭載されています。 CON13 にコイン電池(CR2032、BR2032等)を入れると、ネットワークがなくても時間を維持できると思います。
電池を入れない場合はコンデンサーに残っている電源で数秒は持ちますが(温度等によりますが、今電源を15秒抜いても持ちました)、ネットワークを使わない予定でしたら電池を使うことをおすすめします。
なお、デフォルト状態では Armadillo Base OS の方で ntp を取得しています。単純にネットワークに接続しないのであればデフォルト状態でも問題ありませんが、あえてネットワーク取得をさせたくない場合は chronyd を無効化してください。(persist_file -d /etc/runlevels/default/chronyd)
よろしくお願いします。
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 のメリットは分かりませんでした。)
よろしくお願いします。