0
2

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 1 year has passed since last update.

1日1回実行のバッチと10分間実行のバッチを同時実行しないようにする方法

Last updated at Posted at 2023-03-03

背景

以下のようなバッチを開発することになった。

  • 日次バッチ: 1日1回6時30分のタイミングで動くバッチ
  • 10分毎バッチ:10分毎に動くバッチ

さらに、以下条件が加わる。

  • 日次バッチと10分毎バッチを並列で動かしてはいけない
  • 日次バッチを6時30分に動かして何時に終わるかは不明
  • 日次バッチが動いている間、10分毎バッチは動かしてはいけない
  • 日次バッチを動かしたすぐ後に10分毎バッチを動かす必要がある

タスクスケジューラに日次実行と10分毎実行でバッチ登録した場合、上記の条件を満たすことはできない。
条件を満たすために設定した情報をまとめる。

目次

各種設定にて、設定値の解説を記載している。

各種設定

全ての設定については、後述でまとめる。
ここでは、条件を満たすための設定についてのみ記載する。

タスクスケジューラ

日次バッチ

トリガー

  • 毎日6時30分に実行するよう設定する。

操作

  • 「設定」の「プログラム/スクリプト」については、10分毎バッチでも同じバッチファイルを呼び出す。
  • 「引数の追加」に「0」(任意の数値)を設定する。

設定

  • 「新しいインスタンスをキューに追加」を選択する。

インスタンスについて

  • 新しいインスタンスを開始しない
    • 実行中のタスクがある場合、新しいタスクは開始しない。
  • 新しいインスタンスを並列で実行
    • 実行中のタスクがある場合でも新しいタスクを並列で実行する。
  • 新しいインスタンスをキューに追加
    • 実行中のタスクが終了するまで、次の新しいタスクは実行せずキューに溜まる。
    • 実行中のタスクが終了した後、キューに溜まった次のタスクを実行する。
  • 既存のインスタンスの停止
    • 実行中のタスクがある状態で新しいタスクの実行時間がきた場合、実行中のタスクを強制終了し、新しいタスクを実行する。

10分毎バッチ

トリガー

  • 毎日10分毎に実行するよう設定する。
  • 日次バッチと同タイミングで起動しないよう6時40分からの開始とする。
  • 日次バッチの10分前に終わるよう「繰り返し間隔」の「継続時間」に1420分間を設定する。
    • 1420分間 = 23時間40分
    • 例えば9月9日の6時40分から10分毎バッチが起動した場合、9月10日の6時20分まで10分毎に実行される。

操作

  • 「設定」の「プログラム/スクリプト」については、日次バッチと同じファイル名を設定する。
  • 「引数の追加」に「1」(任意の数値※ただし日次バッチと被らない数値の必要がある)を設定する。

設定

  • 「新しいインスタンスを開始しない」を選択する。

共通バッチファイル

  • 操作の「プログラム/スクリプト」で設定したファイル
共通バッチファイル.bat
@echo off

call :main %* 4>>%0
goto :eof
:main

if %1 == 0 (
	@rem 6時30分毎実行
	call C:\実行ファイル\日次実行バッチ.exe
	call C:\実行ファイル\10分毎実行バッチ.exe
) else if %1 == 1 (
	@rem 10分毎実行
	call C:\実行ファイル\10分毎実行バッチ.exe
)
  • 「%1」に操作の「引数の追加」で設定した値が設定される。
    • 日次バッチの場合 :0
    • 10分毎バッチの場合:1
  • 「call」でバッチファイルを動かすことで日次バッチの終了後、すぐに10分毎バッチが動くように制御している。

callとstartについて

  • call
    • 呼び出したバッチファイルの終了を待って処理を行う。
    • 並列処理が不可能
  • start
    • 呼び出したバッチファイルの終了を待たずに処理を行う。
    • 並列処理が可能
  • 以下を記載することで日次バッチが起動している場合、10分毎バッチは起動することができない。
    • 共通バッチファイルを日次バッチ、10分毎バッチで同時に開かないよう制御している。
call :main %* 4>>%0
goto :eof
:main

最終的に

  • タスクスケジューラーに日次バッチと10分毎バッチを登録し、共通バッチファイルを作ることで以下の条件を満たすことが可能になった。
    • 日次バッチと10分毎バッチを並列で動かしてはいけない
    • 日次バッチは6時30分に動かしてどの程度で終わるか不明
    • 日次バッチが動いている間、10分毎バッチは動かしてはいけない
    • 日次バッチを動かしたすぐ後に10分毎バッチを動かす必要がある
  • タスクスケジューラーの「操作」の「引数の追加」に値を設定することで、該当のタスクスケジューラー起動時に設定した値が呼出したファイルに渡されることが分かった。
  • 1つのファイルを日次バッチ、10分毎バッチで呼び出すことで並列処理しないよう制御できることが分かった。

全ての設定値

  • 全ての設定値について記載する。

タスクスケジューラ

日次バッチ

全般

image.png

トリガー

image.png
image.png

操作

image.png
image.png

条件

image.png

設定

image.png

10分毎バッチ

全般

image.png

トリガー

image.png
image.png

操作

image.png
image.png

条件

image.png

設定

image.png

参考資料

0
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?