如何解决作为服务运行的挂起的cygwin cp问题

时间:2012-02-03 12:19:20

标签: debugging cygwin cp

我有一台带有古老Hudson的Windows 7机器在Glassfish容器中运行。这运行由长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,这些进程被Windows工具报告为bash.exe,而它们是/usr/bin/cp
  • 根据调试器(Visual Studio),进程没有任何调试信息(预期),只执行cygwin1.dll(仅限根框架),kernel32.dll和{{1}的代码};没有框架指向可执行文件本身。
  • 根据handle.exe只打开一个glassfish日志文件(ntdll.dll),它的工作目录和C:\glassfishv3\glassfish\domains\domain1\logs\jvm.log除此之外只有一堆名为C:\Windows 东西

尝试执行\BaseNamedObjects\或完成时可能会失败,但我仍然不知道如何检查/调试它。

0 个答案:

没有答案