🥝

WSL2のcronでdockerを動かす

2023/07/01に公開

概要

wsl2のcronでdocker環境下のスクリプトを動かすときにけっこう困ったので、備忘録です。
一番のハイライトは、docker -it ... bash というコマンドでdockerに入って作業していたコマンドを、そのままのフラグで入れたのが原因でした。docker -i というように、-itではなく-iフラグでcronに登録しないとバグる!という話です。

cronの起動

  • Windowsの起動時にcronが起動されるようにするため、/srv/cron-start.shというファイルを新規作成し、内部にservice cron restartと書き込みます。
echo "service cron restart" |sudo tee -a /srv/cron-start.sh
  • rootに実行権限を与えます。
sudo chown root: /srv/cron-start.sh && sudo chmod 0744 /srv/cron-start.sh
sudo visudo
# %sudo ALL = NOPASSWD: /srv/cron-start.sh
  • batファイルでWindows起動時にcronを実行するため、以下のコマンドを実行します。
echo "wsl.exe sudo /srv/cron-start.sh" > /mnt/c/Users/ユーザー名/AppData/Roaming/Microsoft/Windows/Start\ Menu/Programs/Startup/wsl-cron.bat
  • 作成後に、Win+Rで"shell:startup"でWindows起動時に実行されるフォルダを開いて、wsl-cron.batをメモ帳などで開き、改行コードをCRLFに変更して保存しなおします。

cronにタスクを登録する

  • crontab -eでcronにタスクを登録するエディタが開きます。Ctrl+X, Shift+Y, Enterで上書き保存できます。
crontab -e
  • 分 時 日 月 曜日の順に記載します。*/1で1単位おきに、というような設定もできます。
    例:毎日21時0分code.shに実行する場合は以下のように記載します。
0 21 * * * /path/to/your/code.sh
  • エラーログを出力する場合は以下のように記載します。
0 21 * * * /path/to/your/code.sh >> /path/to/cron-error.log 2>&1
  • Code.shにdockerコマンドを記載します。このときに、ふだんの手癖で-itと、-tフラグをつけないようにしましょう!!!私はここで数日つまずいていました😢
docker run -i --rm --name env \
    -e PYTHONPATH="/path/to/python/script" \
    -v /path/to/python:/path/to/python \
    env bash /path/to/docker-date.sh
  • docker-date.shの中身として、以下のように入れます。
date >> /path/to/python/data/cron/logdata.txt

本当はpythonのコマンドなどが良いかもですが、今回は簡便に動作確認するため、date関数をファイルに保存するコードにしています。
これでうまくいけばlogdata.txtに時刻が保存されます。

参考文献

https://qiita.com/metastable-void/items/ec73a7adbbca02dd7ed0
https://www.cyberciti.biz/faq/sudo-append-data-text-to-file-on-linux-unix-macos/

Discussion