3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windows10のタスクスケジューラでタスクが失敗したときに再起動させようと思ったが上手くいかず、、結局BATファイル内で再起動させることにした件

Last updated at Posted at 2020-12-17

Windowsには、「タスクスケジューラ」という、日時を指定したり、定期的にBATファイルを動かしたりとできる便利なツールが組み込まれています。

Windows10ならば、左下の「検索」で、「タスク」と打ち込むとタスクスケジューラが候補にあがります。(※「タスクマネージャー」ではないので注意を)

image.png

こちら、1つのタスクに対して↓のように失敗したときの指定ができるようなので、それを使ってみたかったというのが事の発端でした。

image.png

きっと、「プログラムが失敗したとき(Exception発生時とか、Exit 1とか)に、再度実行できる」ような機能なのだと思い、いろいろ工夫してみて、結局はコレが上手く機能せずに、こうしちゃいましたーという話の共有です。

#「タスクスケジューラ」で失敗を検知して、自動で再実行してみた。(けれど、上手くいかなかった…)

私が、BATファイルで動かしたいプログラムは、Pythonです。
実験のために、以下のプログラムを作りました。

py_test03.py
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ファイルを↓のように書きました。

bat_test01.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」で返すことができるようにしました。

タスクスケジューラで再起動の設定をしました。

タスク スケジューラ 2020_12_17 18_53_51.png
タスク スケジューラ 2020_12_17 18_55_55.png

ここで定期的に実行させるプログラムを上記の「bat_test01.bat」を指定します。

タスク スケジューラ 2020_12_17 19_06_18.png

「プロパティ」を開き、以下のように「タスクが失敗した場合の再起動の間隔」と「再起動試行の最大数」を設定

失敗タスクを再起動させれるかの実験 のプロパティ (ローカル コンピューター) 2020_12_17 18_57_05.png

これで、このタスクを適当な時間を指定して、実行してみたのですが、1回しか動きません orz

調べてて、以下のサイト見つけました。どうやら、私と同じことで悩んでるご様子です。。

Windows7のタスクスケジューラの「タスクが失敗した場合の再起動の間隔」の失敗の定義について

「タスクスケジューラ上の「失敗」とはタスクそのものが実行されなかった場合を指している可能性がある」と書かれておりました。おうふorz

#結局、BATファイルの中で再実行させるように修正しました。

以下のようにFOR文で異常な終了コードの場合には、3回までSleep3秒を入れつつ再実行するようにしてみました。

bat_test01.bat
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 フゥ

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?