LoginSignup
0
0

More than 3 years have passed since last update.

1コンテナでcronとジョブを実行する【バグ:cronが実行されない】

Posted at

目次

1.本記事の目的
2.修正前
3.試したこと
4.解決

1. 本記事の目的

書籍のチュートリアルで、

  • 'Hello'とログファイルに標準出力するジョブ
  • 1分周期でジョブを実行するcron

を、1つのコンテナで動かす実装を行った。

イメージを実行すると、1分経過するごとに 'Hello'とログが出力される想定だったが、当初エラーは出力されず、ログも出力されない結果となった。

原因はcronの構文誤りだった。
この問題を解決するまでに試したことや、その結果について記載する。

※ この記事では、MacOS Big Sur バージョン11.2.3を使用しています。

書籍

2. 修正前

修正前のディレクトリ構成、ファイルの内容は以下の通り。

【ディレクトリ構成】
cronjob/
 ├ cron-example/
 ├ Dockerfile/
 └ task.sh/

【Dockerfile】


FROM ubuntu:16.04  
# ubuntu:16.04 のイメージを利用する。イメージはDockerHubにある。
# ubuntuはLinuxディストリビューションの1つ。

RUN apt update
# ubuntuのパッケージマネージャaptを更新する。

RUN apt install -y cron
# aptで、cronをインストールする。

COPY task.sh /usr/local/bin/
COPY cron-example /etc/cron.d/
# 各ファイルをコピーし、コンテナに追加する(右側はコンテナ内のパス)。

RUN chmod 0644 /etc/cron.d/cron-example
# パーミッションを設定する

CMD ["cron","-f"]
# cronはバックグラウンドで動き続けるため、CMDとして実行すると、すぐに終了してしまう。
# このため、フォアグラウンドで実行させる(-fコマンド)。

【task.sh】

#!/bin/sh

echo "[`date`]Hello!" >> /var/log/cron.log

コマンド >> ファイル

Linuxのリダイレクト
コマンドの出力結果をファイルへ追記

参考:5分で一通り理解できる!Linuxのリダイレクト 使い方と種類まとめ

【cron-example】
task.shのジョブを毎分実行する

***** root sh /usr/local/bin/task.sh

【dockerコマンド】
ここではdockerコマンドを使用する。

イメージのビルド
docker image build -t example/cronjob:latest .

イメージの実行
docker container run -d --rm --name cronjob example/cronjob:latest

logファイル実行
docker container exec -it cronjob tail -f /var/log/cron.log

3. 試したこと

task.shは実行できるか

コンテナ内部に入り、shコマンドでtask.shを実行後、ログファイルに出力されるか確認する。

コンテナ内部に入る
docker exec -i -t コンテナ名 bash

task.shを実行する
sh /usr/local/bin/task.sh

ログファイルを確認する
cat /var/log/cron.log

cronの実行権限はあるか

コンテナ内で、cron-exampleがあるフォルダに移動し、0644の権限を確認する。

フォルダ移動
cd etc/cron.d

中身確認
ls 
> cron-example

権限確認
ll
> -rw-r--r-- 1 root root  37 Apr 29 00:12 cron-example

最初の1文字目はファイル種別を表しています。
2文字目から4文字目はファイルの所有者に対する権限を表し、
5文字目から7文字目はファイルの所有グループに対する権限を表し、
8文字目から10文字目はその他に対する権限を表しています

最初の1文字目 : - ファイル
2~4 : rw- 6
5~7 : r-- 4
8~10 : r-- 4

権限は合っている。

crondが起動しているか

起動確認
service cron status
> * cron is running

起動している。

4. 解決

原因:cronの構文誤り

cronで1分周期を設定する場合、以下のように記載する。

*/1 * * * * root sh /usr/local/bin/task.sh

cron-exampleの修正を行い、イメージのビルド、コンテナの作成と実行を行った。
動作確認をしたところ、期待通りだった。

期待する動作は、イメージを実行すると、1分経過するごとに 'Hello'とログが出力されること。

実行結果
[Thu Apr 29 02:38:01 UTC 2021]Hello!
[Thu Apr 29 02:39:01 UTC 2021]Hello!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0