调用exe退出后,xp_cmdshell挂起

Cly*_*yde 6 xp-cmdshell sql-server-2008

我使用xp_cmdshell挂起问题.

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

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

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

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

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

  5. Activity Monitor报告的进程是停留在等待类型的PREEMPTIVE_OS_PROCESSOPS(其他开发人员看到的)或PREEMPTIVE_OS_PIPEOPS(我在当前测试中看到的)

有任何想法吗?

小智 5

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

我设法在不重新启动SQL的情况下杀死它,我所做的是确定运行命令的进程并从任务管理器中删除它.

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

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


Cly*_*yde 0

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

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

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