Контекст: Microsoft Azure; Windows Server 2012 R2.
У мене є невелика кількість завдань у планувальнику. Всі позначені, на вкладці Налаштування, як "Якщо завдання вже запущено, застосовується правило слідувати:" Не запускати новий екземпляр "".
Це добре протягом декількох днів. Тоді планувальник з'являється, щоб запустити новий екземпляр кожного завдання під час запуску. Вони відображаються в диспетчері завдань поряд із вже запущеним завданням, але позначені як "Призупинено".
Це, здається, є загальною ознакою нестабільності системи. Невдовзі після цієї поведінки SQL Server починає погано поводитися.
Я перебуваю в процесі написання скрипту технічного обслуговування (який також повинен використовувати планувальник, більше того - жалість), який буде підраховувати примірники виробничих додатків і відправляти команду розробників sms, якщо в пам'яті є більше одного (один запущений) Це один короткий термін обходу. Довгострокове виправлення було б краще.
Хто-небудь зіткнувся з чим-небудь подібним і, якщо так, то яка фіксація?
Відповідь на пропозиції
Я міг би поставити
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
П: Що ви працюєте саме з планувальником завдань, як пакетний сценарій, файл exe, сценарій PowerShell або що?
A: Тільки EXEs, напр.
<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
Питання: Ви вимкнули, а потім увімкнули ці завдання?
Відповідь: Завдання регулярно вимикаються і знову включаються, коли застосовуються оновлення.
З: Чи були імпортовані завдання з файлу XML?
Відповідь: оригінальне завдання (на іншому сервері) було створено за допомогою графічного інтерфейсу. Результат експортувався до XML, переміщувався до поточного сервера, редагувався та імпортувався.
П: Якщо ви відтворюєте завдання, це виправляє проблему?
A: Ні.
Питання: Чи завершується завдання кодом виходу?
A: Якщо ви маєте на увазі "завершується завдання з Environment.Exit (n)?" тоді так. Однак значення не перевіряється, оскільки завдання визначається як EXE, а не як частина великої CMD.
Питання: Чи можливо, що заплановане завдання припинилося саме тоді, коли передбачається, що нове завдання почнеться?
В: Як би я це встановив?
Питання: Чи можуть два приклади одного і того ж завдання одночасно пояснювати нестабільність, яку ви бачите?
В: Я не впевнений, що я розумію це питання. Ні в якому разі ми не допускаємо одночасне виконання двох екземплярів. Нинішня ситуація полягає в тому, що Windows за власним вибором дозволяє запускати один екземпляр, а інший запускається, але в режимі "призупинено". Цікаво, що наш нинішній досвід полягає в тому, що призупинене завдання не може бути припинено. Тільки виконуване завдання може бути припинено.