1

我有一台在 Glassfish 容器中运行的老式 Hudson 的 Windows 7 机器。这运行由长 cygwin bash 脚本控制的构建。脚本的一部分包含一个循环:

if [ -d "$STASH_DIR" ]; then
    svn status -v images | \
            iconv -f cp1250 -t utf-8 | \
            sed 's+\\+/+g' | \
            grep '^        .*\.\(gif\|png\)$' | \
            while read dummy rev author file; do
        dat=${file%.???}.dat
        if [ -f "$STASH_DIR/$dat.$rev" ]; then
            cp -v "$STASH_DIR/$dat.$rev" "$dat"
        fi
    done || true # Not critical; ignore failures
fi

(有一堆图像和一个对它们进行操作的进程非常慢,所以我将它的结果缓存在一个单独的目录中。这个过程可能会更快,但这是另一个问题。)

现在偶尔cp, 文件列表中的某个地方会挂起。它进入无限循环吃CPU,我必须杀死它。当我这样做时,循环继续并且构建完成。但是由于它只是一个缓存,如果文件没有复制,构建仍然会成功。

所以我的问题是我有什么选项可以解决这个问题?它在 SYSTEM 帐户下作为服务运行,但我确实拥有管理员权限,所以我可以附加一些东西。我只是不知道有什么帮助。我在那里有 Visual Studio,可以在那里安装任何 cygwin 工具,但二进制文件显然不是用调试信息构建的。

编辑:我试过:

  • resmon除了进程全速运行外,没有显示任何有趣的东西。
  • 根据 cygwin 的 ps ,这些进程被报告bash.exe为由 windows 工具报告,这可能很有趣。/usr/bin/cp
  • 根据调试器(Visual Studio),进程没有任何调试信息(预期),并且仅从cygwin1.dll(仅根框架)执行代码,kernel32.dll并且ntdll.dll;没有框架指向可执行文件本身。
  • 根据handle.exe只打开了一个 glassfish 日志文件(C:\glassfishv3\glassfish\domains\domain1\logs\jvm.log),它是工作目录,C:\Windows除此之外只有一堆对象叫做\BaseNamedObjects\something

可能是它在尝试执行cp.exe或完成时失败,但我仍然不知道如何检查/调试它。

4

0 回答 0