2013-05-10 86 views
1

我似乎有一个僵局。我有perl脚本分叉和调用另一个perl脚本。这个过程挂在某个地方。过程挂起和PIPE被阻止

我正在运行该程序: Darwin内核版本12.3.0:Sun Jan 6 22:37:10 PST 2013;根:XNU-2050.22.13〜1/RELEASE_X86_64 x86_64的

“lsof的” 具有4个条目是指相同的PIPE:

perl5.12 1414根1个PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727

的perl5。 12 1768根1个PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727

perl5.12 1759根1 PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727

perl5.12 1760根1个PIPE 0x48937dc1254fe937 16384 - > 0x48937d c1254fe727

我怀疑这是挂起的原因。 我们是否有任何命令可以告诉我哪个进程读取/写入此PIPE? 或任何进一步的信息,将不胜感激。 在此先感谢!

+0

好问题,但脱离这里的话题。尝试serverfault或超级用户。 – pilcrow 2013-05-11 04:09:53

回答

0

有两种可能的可能性我能想到的:由于输出缓冲

  1. 还有的僵局。尝试在所有输出管道上启用自动刷新。如果两个进程使用管道进行双向通信,那么这很可能:它们每个都会写入内容并等待读取响应,但由于输出被缓冲,响应永远不会发送到管道。

  2. 进程正在等待管道上的EOF,但它永远不会到来。如果管道是在父进程中创建的,然后由子进程继承的,则需要确保所有进程都关闭管道的写入端,以便读者读取EOF。

+0

感谢您的及时回应。我尝试在挂起(ps -ax)的脚本上为所有fds(fd-> autoflush;)启用autoflush。但它有助于。我也确保所有的开放都关闭。有什么方法可以知道哪些脚本可能读取或写入PIPE?谢谢你。 – AnuRV 2013-05-11 00:02:15

+0

我可以关闭特定进程的所有打开文件句柄吗?我没有proc文件系统(/ proc//fd)。 – AnuRV 2013-05-13 22:11:11

+0

也许你可以用'dtruss'来看看每个进程在做什么。但是我认为你会发现它们都是在'read()'中,我不知道这会有多大帮助。 – Barmar 2013-05-13 22:24:25