Windowsタスクスケジューラで、毎日特定の時間に実行するようにタスクを設定しました。このタスクは、Windowsサービスを再起動するために作成したバッチファイルを実行するだけです。これはそのファイルの内容です:
net stop "MyService"
net start "MyService"
これはほとんどの部分でうまく機能しているように見えますが、サービスが停止/開始するのではなく、実際に一時停止する場合があります。後で戻ってきて、ただそこに座って一時停止します。
タスクスケジューラがサービスを開始するのではなく一時停止するのはなぜですか?また、どうすればそれを修正できますか?
NSSMを使用してlogstashをサービスにし、NSSMがサービスの開始に使用する.batファイルを作成してからJavaインストールを更新した場合、これが表示されることがあります。バッチファイルでJava.exeへのパスが無効になっていることを確認します。
NSSMなどのユーティリティによってサービスに変換されたEXEは、失敗する可能性があります。
NSSMでさえ彼らの ホームページ でこれを指摘しています:
「...アプリケーションが正常に動作している場合は、nssmを構成して、アプリケーションを再起動するすべての責任を免除し、Windowsに回復アクションを処理させることができます。」
アプリケーションが「正常に動作」していないようです。
NSSMを使用してサービスを停止/開始および再起動する を試すか、それでも問題が解決しない場合は、プログラムを実際のWindowsサービスとして再書き込み/再コンパイルしてください。
この問題はサービス自体が原因であると思われますが、「SCquery」コマンドには回避策があります。
C:\Windows>sc query "MyService" | find "STATE"
STATE : 3 STOP_PENDING
バッチファイルにチェックルーチンを追加して、一定の間隔を置いてサービスステータスを再確認し、サービスプロセスがハングしている場合はサービスプロセスを強制終了し(taskkill/f)、サービスを再起動する(ネットスタート)ことができます。
さらに、ウィンドウを非表示にするためにNSSMを使用する場合は、NSSMを使用する必要はなく、タスクスケジューラのみで同じ目標を達成できます。 (ただし、別の目的を設定する場合は、次のことは無視してください。)
これは、タスクプロパティの[全般]タブの一部です。 「ユーザーがログオンしているかどうかに関係なく実行」を選択すると、セッション0から実行され、ウィンドウは表示されません。次に、スケジュールされたタスクで実行する必要があるのは、現在のようにターゲットプロセス自体を強制終了/再起動することです。これはより堅牢に機能します。