Windowsには、「タスクスケジューラ」という、日時を指定したり、定期的にBATファイルを動かしたりとできる便利なツールが組み込まれています。
Windows10ならば、左下の「検索」で、「タスク」と打ち込むとタスクスケジューラが候補にあがります。(※「タスクマネージャー」ではないので注意を)
こちら、1つのタスクに対して↓のように失敗したときの指定ができるようなので、それを使ってみたかったというのが事の発端でした。
きっと、「プログラムが失敗したとき(Exception発生時とか、Exit 1とか)に、再度実行できる」ような機能なのだと思い、いろいろ工夫してみて、結局はコレが上手く機能せずに、こうしちゃいましたーという話の共有です。
#「タスクスケジューラ」で失敗を検知して、自動で再実行してみた。(けれど、上手くいかなかった…)
私が、BATファイルで動かしたいプログラムは、Pythonです。
実験のために、以下のプログラムを作りました。
import sys
for i in range(5):
print(str(i + 1) + "回目 開始")
if i == 2:
print("エラーが発生")
sys.exit(1)
print(str(i + 1) + "回目 終了")
これで i が 2 になった際に終了コード「1」を返して、強制終了させます。
そして、そのプログラムを実行するBATファイルを↓のように書きました。
echo off
cd /d %~dp0
echo start >> log.txt
python py_test03.py >> log.txt
echo end >> log.txt
EXIT %errorlevel%
これで、「log.txt」に「py_test03.py」から標準出力される文字列が出力され、何回動いたかもわかります。
さらに、最後の「EXIT %errorlevel%」で、「py_test03.py」で発生した終了コードを受け取り、BATファイルの中でも同様に終了コードを「1」で返すことができるようにしました。
タスクスケジューラで再起動の設定をしました。
ここで定期的に実行させるプログラムを上記の「bat_test01.bat」を指定します。
「プロパティ」を開き、以下のように「タスクが失敗した場合の再起動の間隔」と「再起動試行の最大数」を設定
これで、このタスクを適当な時間を指定して、実行してみたのですが、1回しか動きません orz
調べてて、以下のサイト見つけました。どうやら、私と同じことで悩んでるご様子です。。
Windows7のタスクスケジューラの「タスクが失敗した場合の再起動の間隔」の失敗の定義について
「タスクスケジューラ上の「失敗」とはタスクそのものが実行されなかった場合を指している可能性がある」と書かれておりました。おうふorz
#結局、BATファイルの中で再実行させるように修正しました。
以下のようにFOR文で異常な終了コードの場合には、3回までSleep3秒を入れつつ再実行するようにしてみました。
echo off
cd /d %~dp0
SET result=0
SET count=0
:loop
if %count% neq 0 powershell sleep 3
echo start >> log.txt
python py_test03.py >> log.txt
SET result=%ERRORLEVEL%
echo end >> log.txt
SET /a count=%count%+1
echo %count%
if %result% equ 1 if %count% lss 3 goto :loop
これで、とりあえず、やりたかったことは達成!
( ´Д`)=3 フゥ