sql-server-2008 - xp_cmdshell 在被调用的 exe 退出后挂起

标签 sql-server-2008 xp-cmdshell

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

  • 可执行文件被调用,执行其工作,然后退出。由于 exe 中的 ui 提示,它没有挂起。 exe根本没有挂起。 exe从任务管理器的进程列表中消失,exe的内部日志确认它执行了主函数
  • 中的最后一行。
  • 对 xp_cmdshell 的调用不会在 SQL 中返回控制权。它卡在那条线上(它是批次的最后一行)。杀死进程是无效的。它实际上需要重新启动sql server才能摆脱挂起的进程(呃)
  • 挂起仅在第一次运行时发生。只要第一个被挂起,对具有相同参数的过程的后续调用就可以正常工作并正确退出。 SQL 重新启动后,第一个后续调用将再次挂起。
  • 如果它有任何区别,我正在尝试从 exe 接收返回值——我的 sql 过程以:

    exec @i = xp_cmdshell @cmd;
    返回@i;
  • 事件监视器报告进程卡在等待类型 PREEMPTIVE_OS_PROCESSOPS(其他开发人员看到的)或 PREEMPTIVE_OS_PIPEOPS(我在当前测试中看到的)

  • 有任何想法吗?

    最佳答案

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

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

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

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

    关于sql-server-2008 - xp_cmdshell 在被调用的 exe 退出后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9620467/

    相关文章:

    sql-server-2008 - 如何使用SQL Server 2008针对特定日期范围和日期时间编写SQL查询?

    sql - case语句执行代码

    sql-server - 我错过了什么

    c# - BCP Export 自动将空字符串转换为 NUL

    sql - 在一列中查找 n 个最大值

    sql - SSIS 批量插入到单个表中

    sql-server-2008 - 使用通配符删除 SQL Server 中的数据库

    c# - 尝试通过来自数据库触发器的 Web 请求执行 "EXECUTE Master.dbo.xp_CmdShell"命令以在本地创建文本文件时发生错误

    sql-server - 通过 xp_cmdshell 获取文件内容

    sql - 从 SQL Server 创建 zip 文件