Mic*_*ler 7 linux python svn mac-osx
对以下内容的更新:
我在不同数据中心的 Debian 虚拟机上的不相关脚本上遇到了类似的问题。
这看起来很像这里描述的问题(就像问这个问题的人一样,我没有在服务器前配置代理)。
与以下描述的主要区别在于,当我附加到挂起的进程时,我看到的是对recvfrom
而不是的调用read
:
$ strace -p 17527
Process 17527 attached - interrupt to quit
recvfrom(3,
Run Code Online (Sandbox Code Playgroud)
然而,Python 并没有任何被代理的印象:
>>> import os; print os.getenv("HTTP_PROXY"), os.getenv("http_proxy")
None, None
Run Code Online (Sandbox Code Playgroud)
所以我还是很难过。可悲的是,链接的问题也没有最终答案。
(我也想知道这个问题是否相关,但 S3 似乎不太可能不尊重Connection: close
标题。)
我有几个 Debian(Wheezy、x86_64)服务器都表现出以下行为:
所有服务器都有一组 cron 作业,其中包括从 S3 中提取数据。这些通常运行良好,但偶尔会ps aux
显示一些小时或几天前开始的作业仍在运行,并且没有完全完成。
通过strace -p <pid>
显示检查它们,在所有情况下,该进程都挂在读取命令上。比如我刚才查的一个进程的输出是:
$ strace -p 12089
Process 12089 attached - interrupt to quit
read(5,
Run Code Online (Sandbox Code Playgroud)
检查打开的文件描述符给了我这个:
$ sudo lsof -i | grep 12089
python 12089 user 5u IPv4 809917771 0t0 TCP my.server.net:35427->185-201.amazon.com:https (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
起初我认为这只是由于在 Python 脚本中没有设置读取超时,但事实并非如此,原因如下:
socket.setdefaulttimeout
-这是在Python 2.7,但代码基座具有为2.5兼容)从昨天已挂起。svn up --non-interactive
进程(使用subprocess.Popen
, 是值得的)。那个SVN进程的情况是相似的——
Python 正在等待 SVN:
$ strace -p 28034
Process 28034 attached - interrupt to quit
wait4(28127,
Run Code Online (Sandbox Code Playgroud)
并且 SVN 正在等待read
调用完成:
$ strace -p 28127
Process 28127 attached - interrupt to quit
read(6,
Run Code Online (Sandbox Code Playgroud)
该读取指向另一个外部主机:
$ sudo lsof -i | grep 28127
svn 28127 user 3u IPv4 701186417 0t0 TCP my.server.net:49299->sparrow.telecommunity.com:svn (ESTABLISHED)
svn 28127 user 6u IPv4 701186439 0t0 TCP my.server.net:49309->sparrow.telecommunity.com:svn (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
(似乎在正在更新的目录上svn:externals
设置了一个属性ez_setup svn://svn.eby-sarna.com/svnroot/ez_setup
;根据他们的网站,我认为这是重定向到 Telecommunity.com)
其他可能相关的要点:
svn:externals
是什么;这是在我之前建立的。ifconfig
)没有丢包。我想这表明存在网络配置问题,但我不确定从哪里开始。所以我想我的问题是:
read
我需要知道的调用以避免无限挂起的进程,有什么根本不同吗?我可以在系统级别修复此问题,还是每个单独的进程都出了问题?
很难说,因为尚不清楚协议级别发生了什么。基本上,read(2)
将无限期地阻止提供:-
现在,该过程可能出现问题,例如另一端在发送更多数据之前首先期待您的响应,或者另一端先前的响应预计 SVN 在请求更多数据之前执行其他操作。例如,假设返回错误响应,这将迫使客户端重新发送一些信息。
您无法优雅地解决此问题,因为您无法根据所掌握的信息确定该数据的发送者希望您做什么。但是,有一些可能的方法可以避免该问题并报告该问题。
wait
简单的阻塞模式,而是wait
在父进程中运行和配置警报。现在,当该进程未能在固定时间内完成时,您可以终止它并报告发生的情况。执行此操作的一种廉价方法是更改 subprocess.Popen 来调用该timeout
命令。socket
系统调用以向接收器添加超时。这两件事都不是小事。这可能会导致svn
出现意想不到的行为。OS X 和 Linux 处理读取调用的方式是否存在根本不同,我需要知道这些不同之处以避免无限挂起的进程?
我不知道这个问题的答案,但是如果两者的行为都正确,那么它们的行为方式应该相同。如果您尝试从尚未准备好向您发送数据的套接字读取数据,则无限期地阻塞流是预期的行为。
总的来说,我认为你最好的攻击选择是期望你的svn
命令在特定的时间段内完成。如果它没有杀死它并报告你这样做了。
归档时间: |
|
查看次数: |
8124 次 |
最近记录: |