Почему планировщик задач Windows порождает несколько экземпляров одной и той же задачи, которые сталкиваются друг с другом?

Обзор:

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

Вопрос:

Почему одна задача с одним расписанием решает порождать несколько экземпляров одновременно?

Замечания:

У меня есть отдельная учетная запись пользователя для выполнения задач вместо меня. Этот пользователь действительно является администратором на машине, на которой выполняются задачи, и задачи настраиваются независимо от того, вошел ли пользователь в систему или нет. Также на машине стоит windows server 08 R2.

4 ответа

Существует известная ошибка с планировщиком задач, которая приводит к тому, что он время от времени запускает одну и ту же задачу дважды. Это происходит, когда предыдущая запланированная задача заканчивается точно тогда, когда предполагается запуск новой задачи: планировщик затем запускает одну и ту же задачу дважды.

Доступно исправление: http://support.microsoft.com/kb/2461249

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

Я столкнулся с этой проблемой в Windows Server 2012 R2: на машине размещено запланированное задание, которое должно запускаться каждые 15 минут и отвечает за перемещение файлов с SFTP-сервера.

Дублирующийся экземпляр возник в течение некоторого времени, и я только что смог найти обходной путь.

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

Вот как я добился этого в коде

      # Start mutual exclusion
$Mutex = New-Object -TypeName System.Threading.Mutex -ArgumentList $false, "Global\**MyMutexName**"
$Mutex.WaitOne() | Out-Null

    ***..... Rest of my code here .....***

#Release the mutal exclusion
$Mutex.ReleaseMutex() | Out-Null

Я также обновил запланированное действие задачи, чтобы запустить сценарий PowerShell, и передал аргумент -sta для запуска с включенным режимом STA.

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

Скриншот истории запланированных задач

Я очень надеюсь, что этот ответ поможет кому-то в будущем, поскольку я потратил много месяцев, пытаясь найти решение этой проблемы!

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

Не могли бы вы опубликовать, что именно вы запускаете, и если это какой-то скрипт, включите в него и исходный код скрипта?

У меня было несколько таких Задач, которые, казалось, появлялись несколько раз почти в один и тот же момент. Другие этого не сделали. Я решил это так:

1) Перейдите в свойства задачи

2) На вкладке "Настройки" убедитесь, что внизу находится пункт - "Если задача уже запущена, то применяется следующее правило:"

3) установлен - "Не запускать новый экземпляр"

Наконец, он вел себя как хорошее маленькое задание и выполнялся только один раз, черт возьми, как я этого хотел. Goooood Task. Получаете бисквит.

Другие вопросы по тегам