调用exe退出后,xp_cmdshell挂起

时间:2012-03-08 15:45:08

标签: sql-server-2008 xp-cmdshell

使用xp_cmdshell挂起时出现问题。

  1. 调用可执行文件,执行其工作并退出。由于exe中的ui提示,它不会挂起。 exe根本没有悬挂。 exe从任务管理器的进程列表中消失,来自exe的内部日志记录确认它执行了主函数中的最后一行

  2. 对xp_cmdshell的调用不会在SQL中返回控件。它挂在那一行(它是批处理的最后一行)。杀死这个过程是无效的。它实际上需要重新启动sql server来摆脱挂起的进程(呃)

  3. 挂起仅在第一次运行时发生。只要第一个挂起,对具有相同参数的过程的后续调用就会正常工作并正确退出。重新启动SQL后,第一个后续调用将再次挂起。

  4. 如果它有任何区别,我试图从exe接收返回值 - 我的sql过程结束于:

    exec @i = xp_cmdshell @cmd; 返回@i;

  5. 活动监视器报告的过程停留在等待类型的PREEMPTIVE_OS_PROCESSOPS(其他开发人员看到的)或PREEMPTIVE_OS_PIPEOPS(我在当前测试中看到的)

  6. 有什么想法吗?

3 个答案:

答案 0 :(得分:5)

我自己遇到过这种情况,我通过xp_cmdshell运行了无效评论。

我设法在不重新启动SQL的情况下杀死它,我所做的就是识别运行命令的进程并从任务管理器中终止它。

假设您的SQL在Windows 2008中向上运行: 在任务管理器,进程选项卡下。我启用了列以显示每个进程的命令行(例如:View - > Select Columns ..)。

如果您不确定通过xp_cmdshell运行的命令,dbcc inputbuffer( SPID )应该为您提供线索。

答案 1 :(得分:3)

我们遇到了同样的问题,SQL Server 2008,还有涉及xp_cmdshell和BCP的调用。杀死sql进程ID没有帮助,它只会停留在“KILLED / ROLLBACK”状态。

杀死它的唯一方法是杀死Windows任务管理器中的bcp.exe进程。

最后,我们将问题追溯到调用xp_cmdshell的sproc中的错误SQL。错误地在循环中打开多个事务而不关闭它们。修正了BEGIN / COMMIT转换问题后,PREEMPTIVE_OS_PROCESSOPS再也没有回来。

答案 2 :(得分:0)

我们最终确实在这里找出了问题。被调用的应用程序用于在发生某些情况时自动将某些文档转储到打印机。

事实证明,特定的打印驱动程序在打印作业的通知托盘中弹出一个奇怪的小窗口。所以它因为ui窗口弹出而挂起 - 但我们的应用程序正在退出,因为它不是我们的窗口,它是由打印驱动程序触发的窗口。

该驱动程序包含关闭该显示窗口的选项。设置该选项后,我们的问题就消失了。