質問: process.getcurrentprocess().processname; if (process.getprocessesbyname(currprocname).length > 1) { warn($"an instance of {currprocname} is already running. only one instance of this application is allowed."); return; } またはすべてのexeに相当します。ただし、現在の設定では、exeの2番目のインスタンスはそのようには実行されず、タスクマネージャーに「一時停止」として表示されるため、これによって警告が発行されることはありません。スケジューラがすでに実行されているかどうかに関係なくジョブを開始できるようにし、exe自体が実行するかどうかを決定するように要求すると、各exeが起動し、場合によっては1分ごとに停止する必要があるため、スケジューラが起動が必要かどうか。約20のタスクがスケジュールされており、1分ごと、5ごと、60ごとなどがあります。コメント#1で尋ねられた質問への回答q:バッチスクリプト、exeファイル、powershellスクリプトなど、タスクスケジューラで正確に何を実行していますか?a:exeのみ、例:.<actions context="author"> <exec> <command>handler.exe</command> <workingdirectory>c:\web\project</workingdirectory> </exec> </actions> q:スケジューラオプションでタスクをどのように設定しますか?a:xmlファイルのサンプル設定: <settings> <multipleinstancespolicy>ignorenew</multipleinstancespolicy> <disallowstartifonbatteries>false</disallowstartifonbatteries> <stopifgoingonbatteries>true</stopifgoingonbatteries> <allowhardterminate>true</allowhardterminate> <startwhenavailable>true</startwhenavailable> <runonlyifnetworkavailable>false</runonlyifnetworkavailable> <idlesettings> <stoponidleend>true</stoponidleend> <restartonidle>false</restartonidle> </idlesettings> <allowstartondemand>true</allowstartondemand> <enabled>true</enabled> <hidden>false</hidden> <runonlyifidle>false</runonlyifidle> <waketorun>false</waketorun> <executiontimelimit>pt1h</executiontimelimit> <priority>7</priority> </settings> xmlファイルからのサンプルトリガー<triggers> <calendartrigger> <repetition> <interval>pt1m</interval> <duration>p1d</duration> <stopatdurationend>false</stopatdurationend> </repetition> <startboundary>2016-03-09t14:20:00</startboundary> <executiontimelimit>pt30m</executiontimelimit> <enabled>true</enabled> <schedulebyday> <daysinterval>1</daysinterval> </schedulebyday> </calendartrigger> </triggers> コメント#2で尋ねられた質問への回答q:これらのタスクを無効にしてから有効にしましたか?a:更新が適用されると、タスクは定期的に無効になり、再度有効になります。q:タスクはxmlファイルからインポートされましたか?a:元のタスク(別のサーバー上)はguiを使用して作成されました。結果はxmlにエクスポートされ、現在のサーバーに移動され、編集およびインポートされました。q:タスクを再作成すると、問題は解決しますか?a:いいえ。q:タスクは終了コードで終了しますか?a:「タスクはenvironment.exit(n)で終了しますか?」という意味の場合その後、はい。ただし、タスクはより大きなcmdの一部としてではなく、exeとして定義されているため、値はチェックされません。q:新しいタスクが開始される予定のときに、スケジュールされたタスクが正確に終了する可能性はありますか?a:どうすればそれを確立できますか?q:同時に実行されている同じタスクの2つのインスタンスで、発生している不安定性を説明できますか?a:質問がよくわかりません。 2つのインスタンスを同時に実行することは許可されていません。現在の状況では、windowsは独自に選択した時点で、1つのインスタンスの実行を許可し、別のインスタンスの実行を許可しますが、「一時停止」モードです。興味深いことに、現在の経験では、中断されたタスクを終了することはできません。実行中のタスクのみを終了できます。
回答: あなたの問題についての私の見解は、それが次の行によって引き起こされているということです:<stoponidleend>true</stoponidleend> これが私が理論化するものですあなたのシナリオです: プロセスは、カーネル呼び出しで待機状態で停止します。この状態では停止できません。 コンピューターはアイドル状態になり、その後アイドル状態から抜け出しました。 タスクスケジューラはプロセスを停止しようとしましたが、ゾンビ状態でプロセスを一時停止することしかできませんでした(停止しましたが終了できません)。 タスクは終了とマークされ、タスクスケジューラは新しいタスクを開始しました。 元のタスクはおそらくsqlトランザクションの途中であり、まだロックを保持している可能性があるため、sqlデータベースの動作が損なわれていました。 解決策は、stoponidleendをfalseに設定することです。コンピュータがアイドル状態になったため、タスクを終了する理由はありませんが、短時間です。実際、sqlサーバーに接続されているタスクを残酷に停止することは非常に悪い考えです。これは、進行中のトランザクションが未完了のままになり、ロールバックさえされないためです。