Python subprocess.Popen挂起
我查看了之前提出的问题,没有发现类似的问题。我错过了一个,请让我知道,我很抱歉再次问同样的问题 我正在调试一个问题,在执行以下代码(Python2.6)时出现了Popen挂起: 如果改用“调用”阻塞方法,也会发生这种情况。此问题目前仅在此节点上发生。它运行Suse SLES 11 SP1 故障节点上的strace显示以下内容:Python subprocess.Popen挂起,python,subprocess,freeze,Python,Subprocess,Freeze,我查看了之前提出的问题,没有发现类似的问题。我错过了一个,请让我知道,我很抱歉再次问同样的问题 我正在调试一个问题,在执行以下代码(Python2.6)时出现了Popen挂起: 如果改用“调用”阻塞方法,也会发生这种情况。此问题目前仅在此节点上发生。它运行Suse SLES 11 SP1 故障节点上的strace显示以下内容: <snip> fstat(5, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0 open("/usr/lib6
<snip>
fstat(5, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0
open("/usr/lib64/python2.6/lib-dynload/cStringIO.so", O_RDONLY) = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\34\0\0\0\0\0\0"..., 832) =832
fstat(6, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0
mmap(NULL, 2117912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x7f0cd5987000
fadvise64(6, 0, 2117912, POSIX_FADV_WILLNEED) = 0
mprotect(0x7f0cd598b000, 2093056, PROT_NONE) = 0
mmap(0x7f0cd5b8a000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x3000) = 0x7f0cd5b8a000
close(6) = 0
mprotect(0x7f0cd5b8a000, 4096, PROT_READ) = 0
close(5) = 0
close(4) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
close(3) = 0
pipe([3, 4]) = 0
pipe([5, 6]) = 0
fcntl(6, F_GETFD) = 0
fcntl(6, F_SETFD, FD_CLOEXEC) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f0cd793e9d0) = 27688
close(6) = 0
close(4) = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0cd5886000
read(5, "", 1048576) = 0
mremap(0x7f0cd5886000, 1052672, 4096, MREMAP_MAYMOVE) = 0x7f0cd5886000
close(5) = 0
munmap(0x7f0cd5886000, 4096) = 0
fcntl(3, F_GETFL) = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0cd794a000
lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
munmap(0x7f0cd794a000, 4096) = 0
wait4(27688,
下面是另一个节点上的输出,该代码在该节点上工作:
<snip>
fstat(5, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0
open("/usr/lib64/python2.6/lib-dynload/cStringIO.so", O_RDONLY) = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\34\0\0\0\0\0\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0
mmap(NULL, 2117912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x7f57b3833000
fadvise64(6, 0, 2117912, POSIX_FADV_WILLNEED) = 0
mprotect(0x7f57b3837000, 2093056, PROT_NONE) = 0
mmap(0x7f57b3a36000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x3000) = 0x7f57b3a36000
close(6) = 0
mprotect(0x7f57b3a36000, 4096, PROT_READ) = 0
close(5) = 0
close(4) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
close(3) = 0
pipe([3, 4]) = 0
pipe([5, 6]) = 0
fcntl(6, F_GETFD) = 0
fcntl(6, F_SETFD, FD_CLOEXEC) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f57b57ea9d0) = 32277
close(6) = 0
close(4) = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57b3732000
read(5, "", 1048576) = 0
mremap(0x7f57b3732000, 1052672, 4096, MREMAP_MAYMOVE) = 0x7f57b3732000
close(5) = 0
munmap(0x7f57b3732000, 4096) = 0
fcntl(3, F_GETFL) = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57b57f6000
lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
munmap(0x7f57b57f6000, 4096) = 0
wait4(32277, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 32277
--- SIGCHLD (Child exited) @ 0 (0) ---
close(3) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f57b50386a0}, {0x7f57b52d88f8, [], SA_RESTORER, 0x7f57b50386a0}, 8) = 0
exit_group(0) = ?
fstat(5,{st_mode=S_IFREG | 0644,st_size=22808,…})=0
打开(“/usr/lib64/python2.6/lib dynload/cStringIO.so”,O_RDONLY)=6
读(6),“\177ELF\2\1\1\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\34\0\0\0\0\0\0\0\0”…,832)=832
fstat(6,{st_mode=S_IFREG | 0644,st_size=22808,…})=0
mmap(NULL,2117912,保护读取,保护执行,映射私有,映射DENYWRITE,6,0)=0x7F57B383000
fadvise64(6,0,2117912,POSIX_FADV_WILLNEED)=0
M保护(0x7f57b3837000、2093056、无保护)=0
mmap(0x7F57B3A3600012288,保护读写,映射私有,映射固定,映射DENYWRITE,6,0x3000)=0x7F57B3A336000
关闭(6)=0
mprotect(0x7F57B3A360004096,保护读取)=0
关闭(5)=0
关闭(4)=0
getrlimit(RLIMIT_NOFILE,{rlim_cur=1024,rlim_max=1024})=0
关闭(3)=0
管道([3,4])=0
管道([5,6])=0
fcntl(6,F_GETFD)=0
fcntl(6,F_SETFD,FD_CLOEXEC)=0
克隆(child_stack=0,flags=clone_child_CLEARTID | clone_child_SETTID | SIGCHLD,child_tidptr=0x7f57bea9d0)=32277
关闭(6)=0
关闭(4)=0
mmap(NULL,1052672,保护读写,映射私有,映射匿名,-1,0)=0x7F57B373000
读(5,“,1048576)=0
mremap(0x7f57b3732000、1052672、4096,mremap_MAYMOVE)=0x7f57b3732000
关闭(5)=0
munmap(0x7f57b3732000,4096)=0
fcntl(3,F_GETFL)=0(仅限标志)
fstat(3,{st_mode=S_iffo | 0600,st_size=0,…})=0
mmap(NULL,4096,保护读取|保护写入,映射私有|映射匿名,-1,0)=0x7F57B6000
lseek(3,0,SEEK_CUR)=-1 ESPIPE(非法SEEK)
fstat(3,{st_mode=S_iffo | 0600,st_size=0,…})=0
munmap(0x7f57b57f6000,4096)=0
wait4(32277,[{WIFEXITED(s)和&WEXITSTATUS(s)==0}],0,NULL)=32277
---SIGCHLD(孩子退出)@0(0)---
关闭(3)=0
rt_sigaction(SIGINT,{SIG_DFL,[],SA_RESTORER,0x7f57b50386a0},{0x7f57b52d88f8,[],SA_RESTORER,0x7f57b50386a0},8)=0
退出组(0)=?
我想不出这个节点出了什么问题?为什么这个命令挂在第一个节点上而不是第二个节点上(运行完全相同的OS和python版本)
任何帮助都将不胜感激
提前谢谢大家,
D
另外,如果有人想要任何一个节点的完整strace输出,请让我知道。我只允许让这台机器保持这种状态直到星期一:-(使用
子进程调用(…stdout=PIPE)是错误的。
这将把stdout重定向到一个管道,但是当前进程没有读取这个管道,因此子进程在输出超过N字节的数据后将阻塞(N字节取决于操作系统)
您需要的是
子进程。请检查输出()
以下是有关上述挂起进程(27688)的一些额外数据:root#l/proc/27688/fd total 0 dr-x------2 root root 0 Dec 6 15:38./dr-xr-xr-x7 root 0 Dec 6 15:34../lrwx------1 root 64 Dec 6 16:00 0->/dev/pts/2 l-wx------1 root 64 Dec 6 16:00 1管道:[5852827]l-wx------1根根64 Dec 6 15:38 2->管道:[5852827]lr-x-----1 root root 64 Dec 6 16:00 255->/sbin/service*我在使用子进程启动守护进程时看到了相同的情况,但并非所有的守护进程都会出现这种情况。我猜想,派生守护进程的进程没有正确结束或没有关闭其stdout/stderr。很抱歉,我的原始代码造成了混淆(在我尝试使用另一个调用之前)如下:\\感谢您的回复。很抱歉造成混淆。我的原始代码(在我尝试使用另一个调用之前)如下(使用相同的命令cmd,即“service drbd start”):p=subprocess.Popen(cmd.split(),stdout=subprocess.PIPE,stderr=subprocess.stdout)res=p.communicate()
此命令挂起(我还尝试使用subprocess.PIPE for stderr获得相同的结果)。直接在shell中运行时,它返回以下内容:启动DRBD资源:[].
请注意,如果我用ls-l
替换命令,它就可以正常工作。更有趣的是,如果我使用以下命令service drbd status
甚至service drbd stop
这些命令也可以工作。运行“service drbd start”有什么特别之处?我使用的是python 2.6。没有check_output()
子流程模块中的函数。p.communicate()
版本看起来不错(这也是检查输出()
内部所做的)。我不知道服务drbd启动的特殊之处,抱歉。。。
root 27688 27659 0 15:34 pts/2 00:00:00 /bin/sh /sbin/service drbd start
root 27690 27688 0 15:34 pts/2 00:00:00 /bin/bash /etc/init.d/drbd start
<snip>
fstat(5, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0
open("/usr/lib64/python2.6/lib-dynload/cStringIO.so", O_RDONLY) = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\34\0\0\0\0\0\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0644, st_size=22808, ...}) = 0
mmap(NULL, 2117912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x7f57b3833000
fadvise64(6, 0, 2117912, POSIX_FADV_WILLNEED) = 0
mprotect(0x7f57b3837000, 2093056, PROT_NONE) = 0
mmap(0x7f57b3a36000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x3000) = 0x7f57b3a36000
close(6) = 0
mprotect(0x7f57b3a36000, 4096, PROT_READ) = 0
close(5) = 0
close(4) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
close(3) = 0
pipe([3, 4]) = 0
pipe([5, 6]) = 0
fcntl(6, F_GETFD) = 0
fcntl(6, F_SETFD, FD_CLOEXEC) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f57b57ea9d0) = 32277
close(6) = 0
close(4) = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57b3732000
read(5, "", 1048576) = 0
mremap(0x7f57b3732000, 1052672, 4096, MREMAP_MAYMOVE) = 0x7f57b3732000
close(5) = 0
munmap(0x7f57b3732000, 4096) = 0
fcntl(3, F_GETFL) = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f57b57f6000
lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
munmap(0x7f57b57f6000, 4096) = 0
wait4(32277, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 32277
--- SIGCHLD (Child exited) @ 0 (0) ---
close(3) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f57b50386a0}, {0x7f57b52d88f8, [], SA_RESTORER, 0x7f57b50386a0}, 8) = 0
exit_group(0) = ?