Контекст: 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 разрешает запуск одного экземпляра, а другой - в "приостановленном" режиме. Интересно, что наш текущий опыт заключается в том, что приостановленная задача не может быть завершена. Только запущенная задача может быть прервана.