it-swarm-ja.com

Microsoftタスクスケジューラの初期の不安定性?

コンテキスト:Microsoft Azure; Windows Server 2012R2。

スケジューラーに少数のタスクがあります。 [設定]タブで、「タスクがすでに実行されている場合は、次のルールが適用されます: '新しいインスタンスを開始しないでください'」としてすべてがマークされます。

これは数日間は問題ありません。次に、スケジューラーは、タスクの実行中に各タスクの新しいインスタンスを開始するように見えます。これらは、すでに実行中のタスクの横にあるタスクマネージャーに表示されますが、「一時停止」とマークされています。

これは、システムの不安定性の一般的な兆候のようです。この動作が表面化した直後に、SQLServerは誤動作を開始します。

私は、本番アプリケーションのインスタンスをカウントし、複数のメモリにある場合(1つが実行されている場合)に開発チームにSMSを送信するメンテナンススクリプト(スケジューラーも使用する必要がありますが、残念です)を作成中です。 、1つは一時停止されています。)これは短期的な回避策です。長期的な修正の方が良いでしょう。

誰かがこのような何かに遭遇したことがありますか?もしそうなら、修正は何ですか?

提案への回答

私は置くことができます

var currProcName = 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つのインスタンスの実行を許可し、別のインスタンスの実行を許可しますが、「一時停止」モードです。興味深いことに、現在の経験では、中断されたタスクを終了することはできません。実行中のタスクのみを終了できます。

3
bugmagnet

タスクスケジューラとアイドル状態

アイドル状態に関してタスクスケジューラジョブを構成する方法は2つあるようです。 -)。

  1. StopOnIdleEndtrueに設定されている場合、RestartOnIdleになります。 trueも、目的の結果がタスクの終了と再開である場合。

    サイクリングアイドル状態

    コンピューターがアイドル状態の内外を循環している場合は、次のアイドル状態を使用してタスクを終了および再開できます。

    タスクを終了して再開するには、プロパティと要素の両方をTrueに設定する必要があります。

    • アイドル状態が終了したときにタスクを終了するには、 StopOnIdleEnd プロパティまたは StopOnIdleEnd 要素をTrueに設定します。

    • コンピューターが再びアイドル状態になったときにタスクを再開するには、 RestartOnIdle プロパティまたは RestartOnIdle 要素をTrueに設定します。


    構成例

    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>true</RestartOnIdle>
    </IdleSettings>
    

    これらは両方ともTrueに設定する必要があります。


  1. 目的の結果がアイドル状態でのタスクの実行を停止しないことである場合は、両方の RestartOnIdle =および StopOnIdleEndfalseに設定されます。

    構成例

    <IdleSettings>
      <StopOnIdleEnd>false</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    

これらは両方ともFalseに設定する必要があります。

0
Pimp Juice IT

あなたの問題についての私の見解は、それが次の行によって引き起こされているということです:

<StopOnIdleEnd>true</StopOnIdleEnd>

これが私が理論化するものですあなたのシナリオです:

  • プロセスは、カーネル呼び出しで待機状態で停止します。この状態では停止できません。
  • コンピューターはアイドル状態になり、その後アイドル状態から抜け出しました。
  • タスクスケジューラはプロセスを停止しようとしましたが、ゾンビ状態でプロセスを一時停止することしかできませんでした(停止しましたが終了できません)。
  • タスクは終了とマークされ、タスクスケジューラは新しいタスクを開始しました。
  • 元のタスクはおそらくSQLトランザクションの途中であり、まだロックを保持している可能性があるため、SQLデータベースの動作が損なわれていました。

解決策は、StopOnIdleEndfalseに設定することです。コンピュータがアイドル状態になったため、タスクを終了する理由はありませんが、短時間です。実際、SQLサーバーに接続されているタスクを残酷に停止することは非常に悪い考えです。これは、進行中のトランザクションが未完了のままになり、ロールバックさえされないためです。

0
harrymc