🥝
WSL2のcronでdockerを動かす
概要
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に時刻が保存されます。
参考文献
Discussion