Windows 工作排程器如何處理還在執行中的工作

Windows 工作排程器 > 設定 > 如果工作已在執行中,下列規則將會套用:(If the task is already running, then the following rule applies)

之前用 Windows 工作排程器 都是用來執行會自動關閉的程式/Script,所以沒有設定上圖的這個選項『如果工作已在執行中,下列規則將會套用:(If the task is already running, then the following rule applies)』都沒有關係,因為舊工作很快就執行完成,執行新工作的時候不會看到還在執行中的舊工作。

這次嘗試要每天重啟一個會持續執行的程式,因為該程式發生問題並不會自己關閉,在設定上遇到了一些問題,先來解釋一下上面圖片的四個選項:

  • 不要啟動新執行個體(Do not start a new instance):預設選項。準備執行新工作時,如果舊工作還在執行,那就不會執行新工作。
  • 以平行方式執行新執行個體(Run a new instance in parallel):不管舊工作是否還在執行,都會執行新工作。
  • 佇列新執行個體(Queue a new instance):準備執行新工作時,如果舊工作還在執行,會將新工作放入一個佇列等待,等舊工作執行完畢才會執行新工作。
  • 停止現有的執行個體(Stop the existing instance):準備執行新工作時,如果舊工作還在執行,會先將舊工作關閉再執行新工作。

首先要注意的是,不要用手動執行工作的方式來驗證,你會發現每次新工作都會執行成功,但實際上自動跑的時候,行為結果都跟你想的不一樣。可以利用反覆設定僅一次的觸發時間,等到觸發時間到來驗證看看新工作是否有順利執行。

以下針對我這次的問題做紀錄,我想要定期重新執行一個 exe 檔案(因為它會發生錯誤且不會結束),四個選項觀察到的結果如下:

  • 不要啟動新執行個體(Do not start a new instance):不會執行新工作,所以排程時間過了,還是只會看到原先執行的 exe 檔案。
  • 以平行方式執行新執行個體(Run a new instance in parallel):會執行新工作,所以會看到越來越多 exe 檔案被執行。
  • 佇列新執行個體(Queue a new instance):會將新工作放入一個佇列等待,但因為原先執行的 exe 檔案不會結束,所以排程時間過了,還是只會看到原先執行的 exe 檔案。
  • 停止現有的執行個體(Stop the existing instance):沒有正確關閉原先執行的 exe 檔案(bug?),所以會看到越來越多 exe 檔案被執行。

最終的做法是,在排程工作中加入 taskkill 指令(用來刪除原先執行的 exe 檔案) + 佇列新執行個體(Queue a new instance),確保新工作總是會被執行,而執行新工作的第一個步驟就是刪除執行中的 exe 檔案,再重新執行 exe 檔案。

1 則回應:

匿名 提到...

如何 佇列等待