3

Контекст: Microsoft Azure; Windows Server 2012 R2.

У меня есть небольшое количество задач в планировщике. На вкладке «Настройки» все они помечены как «Если задача уже выполняется, применяется следующее правило:« Не запускать новый экземпляр »».

Это хорошо в течение нескольких дней. Затем появляется планировщик для запуска нового экземпляра каждой задачи во время ее выполнения. Они отображаются в диспетчере задач рядом с уже запущенной задачей, но помечены как «Приостановлено».

Это кажется общим признаком нестабильности системы. Вскоре после появления такого поведения SQL Server начинает плохо себя вести.

Я нахожусь в процессе написания сценария обслуживания (который также должен будет использовать планировщик, больше жаль), который будет подсчитывать экземпляры производственных приложений и отправлять команде разработчиков смс, если в памяти находится более одного (один работает одна приостановлена.) Это краткосрочный обходной путь. Долгосрочное исправление было бы лучше.

Кто-нибудь сталкивался с чем-то подобным, и если да, то в чём дело?

Ответ на предложения

Я мог бы поставить

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-файла не запускается как таковой, а отображается в диспетчере задач как "Приостановлено".

Разрешение планировщику запустить задание, независимо от того, выполняется оно уже или нет, и требование самого EXE-файла определить, должен ли он выполняться или нет, кажется несколько неэффективным, поскольку для этого требуется, чтобы каждый EXE-файл запускался и, возможно, умирал каждую минуту, а не позволял планировщику определить запуск необходим или нет.

У нас запланировано около 20 заданий, некоторые каждую минуту, некоторые каждые 5, некоторые каждые 60.

Ответы на вопросы, заданные в комментариях # 1

Вопрос: Что именно вы запускаете с планировщиком задач, например, пакетный скрипт, исполняемый файл, скрипт PowerShell или что?

A: только EXE, например

<Actions Context="Author">
  <Exec>
    <Command>Handler.exe</Command>
    <WorkingDirectory>C:\Web\Project</WorkingDirectory>
  </Exec>
</Actions>

Вопрос: Как у вас настройки задач в настройках планировщика?

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: Исходная задача (на другом сервере) была создана с использованием графического интерфейса. Результат был экспортирован в XML, перемещен на текущий сервер, отредактирован и импортирован.

В: Если вы воссоздаете задачу, решает ли это проблему?

A: Нет.

В: Завершается ли задача кодом завершения?

A: Если вы имеете в виду «завершается ли задача окружающей средой.Выход (п)?" тогда да. Однако значение не проверяется, поскольку задача определена как EXE, а не как часть большего CMD.

В: Возможно ли, что запланированное задание завершилось именно тогда, когда предполагается запуск нового задания?

A: Как мне это установить?

В: Могут ли два экземпляра одной и той же задачи, выполняемой одновременно, объяснить возникшую нестабильность?

A: Я не уверен, что понимаю вопрос. Мы ни в коем случае не допускаем одновременного запуска двух экземпляров. Текущая ситуация такова, что в любой момент Windows разрешает запуск одного экземпляра, а другой - в "приостановленном" режиме. Интересно, что наш текущий опыт заключается в том, что приостановленная задача не может быть завершена. Только запущенная задача может быть прервана.

2 ответа2

0

Планировщик заданий и условия простоя

Кажется, есть два способа настройки задания планировщика заданий в отношении условий простоя.

  1. Если для StopOnIdleEnd установлено значение true, то RestartOnIdle должен иметь значение true, если желаемый результат должен завершить и перезапустить задачу.

    Велоспорт простоя

    Если компьютер входит и выходит из состояния ожидания, вы можете завершить и перезапустить задачу, используя следующие условия ожидания.

    Чтобы завершить и перезапустить задачу, оба свойства и элементы должны быть установлены в True:

    • Чтобы завершить задачу, когда условие ожидания завершается, установите для свойства StopOnIdleEnd или элемента StopOnIdleEnd значение True.

    • Чтобы перезапустить задачу, когда компьютер снова перейдет в состояние ожидания, установите для свойства RestartOnIdle или элемента RestartOnIdle значение True.


    Пример конфигурации

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

    Оба из них должны быть установлены в True.


  1. Если желаемый результат заключается в том, что задача не будет останавливаться в состоянии ожидания, тогда вам нужно убедиться, что для RestartOnIdle и StopOnIdleEnd задано значение false.

    Пример конфигурации

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

Оба из них должны быть установлены в False.

0

Моя проблема в том, что это вызвано строкой:

<StopOnIdleEnd>true</StopOnIdleEnd>

Вот что я теоретизирую по вашему сценарию:

  • Процесс останавливается в состоянии ожидания при вызове ядра. В этом состоянии его нельзя остановить.
  • Компьютер перешел в состояние ожидания, а затем вышел из него.
  • Планировщик заданий попытался остановить процесс, но сумел только приостановить его в состоянии зомби (остановлен, но не может завершиться).
  • Помеченная задача завершена, Планировщик задач запустил новую.
  • Так как исходная задача находилась в середине транзакции SQL и все еще может удерживать блокировки, поведение базы данных SQL было нарушено.

Решение должно состоять в том, чтобы установить StopOnIdleEnd в false . Нет причины завершать задачу, потому что компьютер перешел в состояние ожидания, хотя и ненадолго. На самом деле, это очень плохая идея - жестоко остановить любую задачу, которая связана с сервером SQL, потому что она оставляет текущую транзакцию незавершенной и даже не откатанной.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .