TL;DR
.batファイルを使って間接的にアプリケーションを起動することで、タスクスケジューラから強制終了されることなく動作させることが可能。
事象
Surface Go 3(Microsoft Windows バージョン21H2 OSビルド22000.856)で起動時に管理者権限を必要とするアプリケーション(.exe)をタスクスケジューラを用いてログインと同時に起動することを試みた。
起動は成功したが、その後Surface Go 3をスリープさせると対象アプリケーションのプロセスが必ず無言で終了してしまう。イベントビューアにApplication Errorのエントリは記載されない。また、起動したいアプリケーションをタスクスケジューラではなく手動で実行してスリープ状態にした場合、10回ほどの試行で強制終了することはないことを確認。よってアプリケーションの問題である可能性は低いと判断。
タスクスケジューラの実行結果には「プロセスを途中で強制終了しました(0x8007042B)」と記載されるため、終了させている主体はタスクスケジューラと推測。
原因
タスクスケジューラから直接アプリケーションを実行した場合、当該アプリケーションが終了するまで「タスクが実行中」と判断するようだ。タスクスケジューラを見るとステータスとして「タスクは実行中です」と表示されるのが分かる。
明確な根拠はないが、タスクスケジューラはタスクの実行中に「本体がスリープ状態になる」など何らかの条件を満たすと、タスクに対応するプロセスを強制終了させる仕組みがあるのではないかと推測する。
対処方法
タスクスケジューラから直接アプリケーションを起動するのではなく、以下のような.batファイルを使って間接的にアプリケーションを起動させる。
@echo off
start "" "C:\apps\xxx\hoge.exe"
タスクスケジューラから見るとhoge.batの実行完了をもって「タスクの完了」とみなすためか、hoge.batがstart
させたhoge.exeについては関知しない。この方法で起動させるとスリープさせてもアプリケーションが無言で強制終了することはなくなる。
付記
タスクスケジューラによる起動のタイミングや条件が同じ場合、hoge.batに複数のstart
を列挙して同時にアプリケーションを起動することも可能。
@echo off
start "" "C:\apps\xxx\hoge.exe"
start "" "C:\apps\zzz\foobar.exe"