因此,我正在编写一个 shell 脚本来检查我们所有相关的 svn 存储库,以便在 svnstat 中进行分析。我已经手动完成了所有这些工作,现在我正在 Vista 笔记本电脑上的 cygwin 中编写一个 bash 脚本,因为我打算在某个时候将其移动到 Linux 服务器上。
编辑:我放弃了这个,写了一个简单的 .bat 脚本。我会用其他方法弄清楚 Linux 部署。
编辑:添加了 sleep 30 和 svn log 命令。现在,我可以通过 svn log 命令知道它无法进入 svn log ... 这次,它执行了应用程序,运行了日志,然后签出数据库,然后冻结了。这次我将 sleep 30 放在日志之前和之后。
二氧化碳
#!/bin/bash
function checkout {
mkdir $1
svn checkout svn://dev-server/$1 $1
svn log --verbose --xml >> svn.log $1
sleep 30
}
cd /cygdrive/c/Users/My\ User/Documents/Repos/wc
checkout Applications
checkout Database
checkout WebServer/www.mysite.com
checkout WebServer/anotherhost.mysite.com
checkout WebServer/AnotherApp
checkout WebServer/thirdhost.mysite.com
checkout WebServer/fourthhost.mysite.com
checkout WebServer/WebServices
在大多数情况下,它都能正常工作 - 但出于某种原因,它往往会在几个存储库之后停止工作,通常是在完成一个存储库后再转到下一个存储库。当它失败时,它不会自行恢复。我试过注释掉 svn 行,当我这样做时,它会进入并创建所有目录 - 所以不是那样的。
我在寻求指导和直接建议。Cygwin 对我来说非常稳定,但最近我开始使用本机 rxvt 而不是“cmd.exe 窗口中的 bash”。我不认为这是问题所在,因为我让远程系统上的 top 整晚都在运行,而 rxvt 似乎并不介意。另外,我没有在 cygwin 中编写任何 bash 脚本,所以我认为这可能不推荐;虽然我不明白为什么不推荐。我不想要所有的 WebServer,因此我只检查某些文件夹。
我怀疑有什么东西挂起了 svn checkout。有什么想法吗?
编辑:这次当我按下 ctrl+z 取消时,我忘记了我是在 Windows 上,然后输入 ps 来查看作业是否仍在运行;正如您所看到的,有很多 svn 进程在徘徊......很奇怪。
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$ jobs
[1]- Stopped bash co2.sh
[2]+ Stopped ./co2.sh
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$ kill %1
[1]- Stopped bash co2.sh
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$
[1]- Terminated bash co2.sh
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
7872 1 7872 2340 0 1000 Jun 29 /usr/bin/svn
7752 1 6140 7828 1 1000 Jun 29 /usr/bin/svn
6192 1 5044 2192 1 1000 Jun 30 /usr/bin/svn
7292 1 7452 1796 1 1000 Jun 30 /usr/bin/svn
6236 1 7304 7468 2 1000 Jul 2 /usr/bin/svn
1564 1 5032 7144 2 1000 Jul 2 /usr/bin/svn
9072 1 3960 6276 3 1000 Jul 3 /usr/bin/svn
5876 1 5876 5876 con 1000 11:22:10 /usr/bin/rxvt
924 5876 924 10192 4 1000 11:22:10 /usr/bin/bash
7212 1 7332 5584 4 1000 13:17:54 /usr/bin/svn
9412 1 5480 8840 4 1000 15:38:16 /usr/bin/svn
S 8128 924 8128 9452 4 1000 17:38:05 /usr/bin/bash
9132 8128 8128 8172 4 1000 17:43:25 /usr/bin/svn
3512 1 3512 3512 con 1000 17:43:50 /usr/bin/rxvt
I 10200 3512 10200 6616 5 1000 17:43:51 /usr/bin/bash
9732 1 9732 9732 con 1000 17:45:55 /usr/bin/rxvt
3148 9732 3148 8976 6 1000 17:45:55 /usr/bin/bash
5856 3148 5856 876 6 1000 17:51:00 /usr/bin/vim
7736 924 7736 8036 4 1000 17:53:26 /usr/bin/ps
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$ jobs
[2]+ Stopped ./co2.sh
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$
这是挂起的 svn 程序的 PID 的 strace,这种情况已经持续了好几个小时。看起来它什么都没做。我一直怀疑服务器上的某些中断导致了这种情况;svn 是否有我不知道的锁定机制?
Kyle Hodgson@KyleHodgson-PC ~/winUser/Documents/Repos
$ strace -p 7304
**********************************************
Program name: C:\cygwin\bin\svn.exe (pid 7304, ppid 6408)
App version: 1005.25, api: 0.156
DLL version: 1005.25, api: 0.156
DLL build: 2008-06-12 19:34
OS version: Windows NT-6.0
Heap size: 402653184
Date/Time: 2009-07-06 18:20:11
**********************************************
答案1
我偶尔会在大型结账时遇到服务器超时问题。您应该会在服务器日志中看到此问题(我在 apache httpd 下运行,我相信它在错误日志文件中)。
建议您捕获 svn checkout 命令的输出(svn checkout svn://dev-server/$1 $1 > svncolog.txt 2>&1)。
如果这是问题所在(或者即使不是),这可能会受到您在 cygwin 下使用的 svn 客户端版本的影响(您只是使用 cygwin 包吗?)——如果还没有,请尝试升级到最新版本,或者尝试安装非 cygwin 命令行客户端并在您的脚本中使用它。
我还不得不指出,您的 bash 脚本此时非常简单:您可以轻松地使用 cmd(批处理)脚本对其进行测试,从而将 cygwin 排除在外。
答案2
猜测:cygwin 或 windows 是否限制了连接数?包括关闭时的 TIME_WAIT 状态?sleep 60
结帐后尝试插入。
答案3
调试建议:
- 在 #!/bin/bash 顶部添加 -x,这样当命令在脚本中运行时,你就会得到命令的踪迹
- 如果你有空闲的进程,可以通过在它们的 PID 上运行 strace -p 来找出它们在干什么
- 如果可能的话,看看它是否在 svn 服务器上本地运行,以排除网络问题