カテゴリー
[ラズパイ] cronをつかってDockerコンテナのシェルスクリプトを定期実行する
※ 当ページには【広告/PR】を含む場合があります。
2020/09/03
2021/02/17
ラズパイでのcron動作環境の確認
cronのサービス起動(初回)
/etc/rsyslog.conf
$ cat /etc/rsyslog.conf
#...中略
#cron.* /var/log/cron.log
#...以下略
$ cat /etc/rsyslog.conf
#...中略
cron.* /var/log/cron.log
#...以下略
$ sudo /etc/init.d/rsyslog restart
/etc/default/cron
-L 15
$ cat /etc/default/cron
#Cron configuration options
#...中略
EXTRA_OPTS="-L 15"
$ sudo /etc/init.d/cron restart
/var/log/
cron.log
cron設定ファイル(crontab)の確認
/etc/crontab
$ cat /etc/crontab
#/etc/crontab: system-wide crontab
#Unlike any other crontab you don't have to run the `crontab'
#command to install the new version when you edit this file
#and files in /etc/cron.d. These files also have username fields,
#that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#Example of job definition:
#.---------------- minute (0 - 59)
#| .------------- hour (0 - 23)
#| | .---------- day of month (1 - 31)
#| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
#| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
#| | | | |
#* * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Job defination
/etc/crontab
crontab
コマンド: crontab
オプション:
-u <ユーザ名>:
設定するcrontabのユーザ名を指定する
(省略すると現在のデフォルトユーザー名, rootなど)
-e:
cron設定ファイルの編集
-l:
登録済みのスケジュール一覧を表示
-r:
登録されているスケジュールの削除
man crontab
余談 ~ "/etc/crontab"の直接編集 vs. "crontab -e"
/etc/crontab
/etc/cron.d/
/etc/crontab
crontab -e
crontab -e
/var/spool/cron/<ユーザー名>
crontab -e
cronの動作テスト
$ crontab -e
#エディタが開くので以下のコマンドを挿入...
* * * * * echo 'Hello cron' >> /tmp/cron.test.txt
#編集後に保存...
$ crontab -l
#...中略
* * * * * echo 'Hello cron' >> /tmp/cron.test.txt
/tmp/cron.test.txt
$ cat /tmp/cron.test.txt
Hello cron
Hello cron
Hello cron
Hello cron
$ crontab -r
$ crontab -l
no crontab for new-user
crontab -r
crontab -e
cronからdockerコンテナ内の対象プログラムをスケジュール実行する
練習編 〜 hello worldイメージを使ってみる
--privileged
hello-world
$ docker pull hello-world
$ docker images
REPOSITORY TAG SIZE
hello-world latest 4.85kB
run
$ docker create --name='my-hello-world' hello-world
bdfde8721d6bbfe95c200b779ec3d7653e678c63bb03995480e5065893bf44f3
$ docker ps -a
CONTAINER ID IMAGE COMMAND STATUS NAMES
bdfde8721d6b hello-world "/hello" Created my-hello-world
my-hello-world
--restart=always
restart
no
$ docker start -a my-hello-world
Hello from Docker!
#...以下略
hello
docker stop <コンテナ名>
$ crontab -e
#1分毎にdocker startを使用してコンテナ内のプログラムを実行
* * * * * docker start -a my-hello-world >> /tmp/cron.hello-docker.log
$ cat /tmp/cron.hello-docker.log
Hello from Docker!
#...以下出力が繰り返しログされる
crontab -r
実用編〜alpineイメージでの利用
hello-world
hello
alpine
docker exec
$ docker pull alpine
$ docker images
REPOSITORY TAG SIZE
alpine latest 3.74MB
docker exec
$ docker create -it --init --name my-alpine alpine
$ docker start my-alpine
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS NAMES
b5f8b73892a6 alpine "/bin/sh" Up my-alpine
docker create + docker start
docker run
$ docker run -d -it --init --name my-alpine alpine
$ docker ps
CONTAINER ID IMAGE COMMAND STATUS NAMES
b5f8b73892a6 alpine "/bin/sh" Up my-alpine
my-alpine
docker exec
$ docker exec my-alpine echo 'Hello alpine!'
Hello alpine!
$ docker exec my-alpine date
Thu Sep 3 08:22:44 UTC 2020
$ crontab -e
#1分毎にdocker execを使用してコンテナ内のプログラムを実行
* * * * * docker exec my-alpine date >> /tmp/cron.alpine-docker.log
$ cat /tmp/cron.alpine-docker.log
Thu Sep 3 08:28:02 UTC 2020
Thu Sep 3 08:29:01 UTC 2020
Thu Sep 3 08:30:02 UTC 2020
Thu Sep 3 08:31:01 UTC 2020
Thu Sep 3 08:32:02 UTC 2020
Thu Sep 3 08:33:01 UTC 2020
急なHotfix ~ ある日突然動かなくなるときに
$ sudo /etc/init.d/cron restart
crontab -l
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー