我有一台在 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
或完成时失败,但我仍然不知道如何检查/调试它。