【问题标题】:xp_cmdshell hangs after called exe has exitedxp_cmdshell 在被调用的 exe 退出后挂起
【发布时间】:2012-03-08 15:45:07
【问题描述】:

我在使用 xp_cmdshell 时遇到了挂起问题。

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

  2. 对 xp_cmdshell 的调用不会返回 SQL 中的控制权。它挂在该行上(它是该批次的最后一行)。杀死进程是无效的。它实际上需要重新启动 sql server 才能摆脱挂起的进程(ugh)

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

  4. 如果有什么不同,我正在尝试从 exe 接收返回值——我的 sql 过程以:

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

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

有什么想法吗?

【问题讨论】:

  • 当您不理会@i 时会发生什么,例如只是exec xp_cmdshell @cmd;?
  • 没试过。我需要等待一个可以重新启动 SQL Server 的窗口。关于如何杀死这个单一进程的任何想法,所以我们不必采取如此激烈的步骤?

标签: sql-server-2008 xp-cmdshell


【解决方案1】:

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

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

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

如果你不确定你通过 xp_cmdshell 运行了什么命令,dbcc inputbuffer(SPID) 应该会给你一个线索。

【讨论】:

    【解决方案2】:

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

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

    最后,我们将问题追溯到调用 xp_cmdshell 的 sproc 中的错误 SQL。这是错误地在一个循环中打开多个交易而不是关闭它们。在 BEGIN/COMMIT 传输问题得到修复后,PREEMPTIVE_OS_PROCESSOPS 再也没有出现过。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 2021-12-17
        • 1970-01-01
        • 2014-11-26
        • 2012-06-10
        • 1970-01-01
        • 2018-08-22
        相关资源
        最近更新 更多