Task Schedulerで実行中のRobocopyを停止したときに、完全にRobocopyが停止しない場合の対処方法
アドベントカレンダー10日目です。
仕事で使った知識で、「これは役に立つ!」と思ったので投稿します。
所謂ゾンビプロセスとなったRobocopyと正常に実行中のRobocopyの見分け方です。
既にご存知の方は読み飛ばしてください。
Task Schedulerでデータのバックアップやデータ移行を行う場合、多数のRobocopyを並列して実行することがあるかと思います。
Task SchedulerでRobocopyのバッチを実行し、それを何らかの理由で途中で停止することもあるかと思います。
しかしTask Schedulerで[終了]を選択したとしても、Robocopyは実行されっぱなしになることがたまにあります。
Robocopyが1本だけ走っている場合はOS再起動で良いかもしれませんが、Task Schedulerで複数実行しているRobocopyのうち、複数のRobocopyは停止し、複数のRobocopyは実行を継続したい場合、OS再起動はできません。
前提条件
Robocopyは便利なのでよく使いますが、必ずログを出力するようにしています。
今回の手法はRobocopyでログを出力していることが前提条件です。
下準備
今回は検証でRobocopyに時間がかかるように、Yドライブに3.5TiBほどのデータを配置し、Zドライブは空っぽにしておきます。
Yドライブは以下の通り
Zドライブは以下の通りです。
で、このYドライブからZドライブにデータをコピーするRobocopyをバッチファイル化します。
そしてこのバッチファイルをTask Schedulerに仕込みます。
こんな感じですね。
複数のRobocopyを実行させるためにVドライブにも3.5TiB、Xドライブも空っぽのものを作り、こちらも同様にバッチファイル化してTask Schedulerに仕込みます。
実際やってみる
準備ができたので実行してみましょう。
事象が再現するかわからないので運を天に任せます。
タスクを実行します。
はい。
どちらか一方を[終了]します。
このタスクを止めていいか聞かれるので、[はい]をクリックしましょう。
当然以下のような状態になります。
強制終了したRobocopyと実行中のRobocopyが混在しています。
この状態だと、タスクマネージャーからRobocopyが動作していても、正常に動作している方か停止した方がゾンビプロセスとして動作し続けているのか確証が持てません。
ゾンビプロセス化したRobocopyの見極めと停止方法
[リソースモニター]を開きます。
[CPU]タブを開いて[関連付けられたハンドル]を選択し、[ハンドルの検索]に前提条件で言及しているログを入力します。
Cドライブ直下にRClogというフォルダを作成し、そこにログを出力しています。
このログのファイル名を先ほどの[リソースモニター]の[ハンドルの検索]に入力します。
ビンゴ!
出ましたね。
これでゾンビプロセス化したRobocopyだけを狙い撃ちで停止できます!
対象のRobocopy.exeを右クリックし[プロセスの終了]をクリックします。
「このRobocopy.exe止めていいの?」と聞いてくるので[プロセスの終了]をクリックします。
便利ですね。
安全、確実にゾンビプロセスを停止可能です。
応用編
これを応用すれば削除するときに別のプロセスがつかみっぱなしで排他処理がかかってしまい、削除できないファイルも削除できるようになります。
例えば以下のような状態ですね。
今回のエラーはちゃんとRobocopyって出てきますが、出てこないパターンも考えられます。
何度再試行しても削除できないことがありますね。
削除できないファイル名を先ほどと同じ[リソースモニター]の[ハンドルの検索]に入力して削除可能です。
このファイル名を
[リソースモニター]の[ハンドルの検索]に入力して
このファイルをつかみっぱなしのプロセスを特定して停止することが可能です。
本日はこれまで。