xp_cmdshell зависает после выхода вызываемого exe - PullRequest
6 голосов
/ 08 марта 2012

У меня проблема с зависанием при использовании xp_cmdshell.

  1. Исполняемый файл вызывается, выполняет свою работу и завершается.Это не висит из-за пользовательского интерфейса в exe.Exe не висит вообще.Exe исчезает из списка процессов в диспетчере задач, а внутренняя регистрация в exe подтверждает, что он выполнил самую последнюю строку в основной функции

  2. вызов xp_cmdshell НЕ возвращает управление вSQL.Он висит на этой строке (это последняя строка пакета).Убить процесс неэффективно.На самом деле требуется перезапуск сервера sql, чтобы избавиться от зависшего процесса (тьфу)

  3. Зависание происходит только при первом запуске.Последующие вызовы процедуры с одинаковыми параметрами работают и завершаются корректно, пока первый из них зависает.После перезапуска SQL первый последующий вызов снова будет зависать.

  4. Если это имеет какое-то значение, я пытаюсь получить возвращаемое значение из exe - моя процедура sql заканчивается:

    exec @i = xp_cmdshell @cmd;return @i;

  5. Activity Monitor сообщает о том, что процесс застрял в типе ожидания PREEMPTIVE_OS_PROCESSOPS (что видел другой разработчик) или PREEMPTIVE_OS_PIPEOPS (что я вижу в моем текущем тестировании)

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 28 августа 2013

Только что сам столкнулся с такой ситуацией, когда я запустил некорректный комментарий через xp_cmdshell.

Мне удалось убить его, не перезапуская SQL. Я определил процесс запуска команды и уничтожил ее из диспетчера задач.

Предположим, ваш SQL работал в Windows 2008вверх: в диспетчере задач, вкладка «Процессы».Я включил столбец для отображения командной строки каждого процесса (например: Вид -> Выбрать столбцы ..).

Если вы не уверены, какую команду вы выполняете через xp_cmdshell, входной буфер dbcc ( SPID * 1008)*) должен дать вам подсказку.

3 голосов
/ 24 ноября 2012

У нас была та же проблема с SQL Server 2008, также с вызовами, включающими xp_cmdshell и BCP.Убить идентификатор процесса sql не помогло, он просто застрял бы в состоянии «KILLED / ROLLBACK».

Единственный способ убить его - это уничтожить процесс bcp.exe в диспетчере задач Windows.

В итоге мы отследили проблему до неправильного SQL в sproc, который вызывал xp_cmdshell.По ошибке было открыто несколько транзакций в цикле, а не закрыты их.После исправления проблем трансляции BEGIN / COMMIT PREEMPTIVE_OS_PROCESSOPS больше не возвращался.

0 голосов
/ 22 апреля 2014

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

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

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

...