我查看了先前提出的问题,但没有找到类似的问题。 我错过了一个,请让我知道,对于再次提出同样的问题,我深表歉意。

我正在调试以下代码(python 2.6)时我将Popen挂起的问题:

#!/usr/bin/env python
import subprocess
cmd = 'service drbd start'
rc  = subprocess.call(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

如果我改为使用“调用”阻止方法,也会发生这种情况。 目前仅在此一个节点上发生此问题。 它运行Suse SLES 11 SP1。

故障节点上的strace显示以下内容:

<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,

它就挂在这里。 相应的过程是:

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)                           = ?

我不知道该节点出了什么问题? 为什么此命令挂在第一个节点上而不挂在第二个节点上(运行完全相同的OS和python版本)?

任何帮助将不胜感激。

先感谢您,

D.

PS。 如果有人希望从任一节点获得完整的strace输出,请告诉我。 我只能将此机器保持这种状态直到星期一:-(

===============>>#1 票数:1

使用subprocess.call(...stdout=PIPE)是错误的。 这会将stdout重定向到管道,但是当前进程未读取该管道,因此子进程将在输出超过N个字节的数据(N取决于操作系统)之后阻塞。

您想要的是subprocess.check_output()

  ask by Djurdjura H. translate from so

未解决问题?本站智能推荐:

3回复

Python Popen()。stdout.read()挂起

我正在尝试使用Python的subprocess.Popen获取另一个脚本的输出,如下所示 它挂在第三行,只有当我将它作为python脚本运行时,我无法在python shell中重现它。 另一个脚本只打印几个单词,我假设它不是缓冲区问题。 有谁知道我在做错了什么?
1回复

子进程,Popen Python

我想运行一个程序,比如MATLAB或其他来自Python的FEA软件,等待它运行并存储结果,然后再用Python进行处理。 我无法找到一个关于如何这样做的真正基本的例子。 一个简单的代码或任何有用的链接将受到高度赞赏。 Subprocess模块​​的帮助看起来有点复杂。
3回复

Popen子进程Python

我正在使用Popen进行远程调用脚本 stdout = s.communicate() 打印标准输出 该脚本不会以shell脚本中提到的状态退出,而是仅显示成功或失败状态。 我想根据外壳脚本退出状态代码。 这是shell脚本 如何获得状态码返回?
1回复

Python定时子进程.Popen

我有以下代码从webscrape获取数据。 我才刚刚学会了如何使用 而且我正在尝试撤销我的倡议以及其他类似问题的答案,以解决如何使用 执行以下脚本,以便每30秒左右更新一次webscrape数据到我的插入字段中。 但这是行不通的。 请您指出正确的方向吗? 我得到的错误是错误No 22:无
1回复

使用Pyinstaller的Python子进程Popen

我使用ffmpeg转换一些视频。 我用subprocess.Popen(...)调用命令 我用这种方法杀了 这是没有编译到exe的okey。 但我编译与pyinstaller与--noconsole子--noconsole无法正常工作。 我必须将subprocess.P
1回复

Python中的子进程Popen和PIPE

以下代码将空行打印为输出,为false。 问题不在于权限,因为我使用777权限测试了pdf -file的命令。 如何修复命令以提供正确的输出?
3回复

Python子进程Popen管道

我试图在python中发出命令并读取输入并将其解析回去。 这是我要发出的命令(例如在命令行上运行时的示例) 我正在尝试使用python子进程 ` 是一个| 子进程无法使用命令? 如果是这样,还有另一种方法可以运行此shell命令并获取输入吗? 更新:(使用单个
2回复

在子进程Popen中使用python

我正在努力将子进程与python一起使用。 这是我的任务: 通过命令行启动api(这与在命令行上运行任何参数没有什么不同) 验证我的API是否已启动。 最简单的方法是轮询标准。 针对API运行命令。 当我能够运行新命令时出现命令提示符 通过轮询标准输出来验
2回复

Python中的子进程Popen函数

我目前正在使用它来调用server.py,它按以下方式设置 我是否能够使用subprocess.popen将参数传递给我的imageScale函数,即我直接从子进程传入参数source,destination和scale
1回复

Python子进程挂起

我正在执行以下子流程... p.call(["./hex2raw", "<", "exploit4.txt", "|", "./rtarget"]) ...它挂了。 但是,如果我执行kmwe236@kmwe236:~/CS485/prog3/target26$ ./hex