相关疑难解决方法(0)

如何终止使用shell = True启动的python子进程

我正在使用以下命令启动子进程:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用时杀死:

p.terminate()
Run Code Online (Sandbox Code Playgroud)

要么

p.kill()
Run Code Online (Sandbox Code Playgroud)

该命令在后台继续运行,所以我想知道如何实际终止该进程.

请注意,当我运行命令时:

p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

它在发出时会成功终止p.terminate().

python linux subprocess kill-process

285
推荐指数
7
解决办法
26万
查看次数

python中子进程读取线上的超时

我有一个小问题,我不太确定如何解决.这是一个最小的例子:

是)我有的

scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(some_criterium):
    line = scan_process.stdout.readline()
    some_criterium = do_something(line)
Run Code Online (Sandbox Code Playgroud)

我想要什么

scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(some_criterium):
    line = scan_process.stdout.readline()
    if nothing_happens_after_10s:
        break
    else:
        some_criterium = do_something(line)
Run Code Online (Sandbox Code Playgroud)

我从子进程读取一行并用它做一些事情.我想要的是在固定时间间隔后没有线路到达时退出.有什么建议?

python subprocess timeout

39
推荐指数
5
解决办法
3万
查看次数

subprocess.check_output与subprocess.call的性能

我已经使用subprocess.check_output()了一段时间来捕获子进程的输出,但在某些情况下遇到了一些性能问题.我在RHEL6机器上运行它.

调用Python环境是linux编译的64位.我正在执行的子进程是一个shell脚本,最终通过Wine触发Windows python.exe进程(为什么这个愚蠢是另一个故事).作为shell脚本的输入,我在一小段Python代码中输入了传递给python.exe的代码.

虽然系统处于中等/重负载(CPU利用率为40%到70%),但我注意到subprocess.check_output(cmd, shell=True)在check_output命令返回之前,子进程完成执行后,使用会导致显着延迟(最多约45秒).ps -efH在此期间查看输出显示被调用的子进程sh <defunct>,直到它最终返回正常的零退出状态.

相反,使用subprocess.call(cmd, shell=True)在相同的中/重负载下运行相同的命令将导致子进程立即返回而没有延迟,所有输出都打印到STDOUT/STDERR(而不是从函数调用返回).

为什么只有在check_output()将STDOUT/STDERR输出重定向到其返回值时才有这么大的延迟,而不是call()只是将它打印回父代的STDOUT/STDERR?

python linux subprocess wine

24
推荐指数
1
解决办法
2万
查看次数

有没有一种很好的方法来检测过时的NFS挂载

我有一个我想要启动的程序,只有几个测试成功完成.

我需要的一个测试是我所有的NFS挂载都很活跃.

我能比蛮力方法做得更好:


mount | sed -n "s/^.* on \(.*\) type nfs .*$/\1/p" | 
while read mount_point ; do 
  timeout 10 ls $mount_point >& /dev/null || echo "stale $mount_point" ; 
done
Run Code Online (Sandbox Code Playgroud)

timeout是一个在后台运行命令的实用程序,如果SIGCHLD在时间限制之前没有捕获,则在给定时间后将其终止,以显而易见的方式返回成功/失败.


英文:解析mount每个NFS挂载点的输出,检查(以超时为限).可选(不在上面的代码中)打破第一个陈旧的安装.

unix linux bash shell nfs

18
推荐指数
4
解决办法
4万
查看次数

Python子进程超时?

是否有任何参数或选项为Python的subprocess.Popen方法设置超时?

像这样的东西:

subprocess.Popen(['..'], ..., timeout=20)

python subprocess timeout pipe popen

18
推荐指数
3
解决办法
3万
查看次数

停止在Python中读取进程输出而不挂起?

我有一个Linux的Python程序几乎看起来像这样:

import os
import time

process = os.popen("top").readlines()

time.sleep(1)

os.popen("killall top")

print process
Run Code Online (Sandbox Code Playgroud)

该程序挂起在这一行:

process = os.popen("top").readlines()
Run Code Online (Sandbox Code Playgroud)

这种情况发生在保持更新输出的工具中,如"Top"

我最好的考验:

import os
import time
import subprocess

process = subprocess.Popen('top')

time.sleep(2)

os.popen("killall top")

print process
Run Code Online (Sandbox Code Playgroud)

它比第一个(它被砍掉)效果更好,但它返回:

<subprocess.Popen object at 0x97a50cc>
Run Code Online (Sandbox Code Playgroud)

第二次试验:

import os
import time
import subprocess

process = subprocess.Popen('top').readlines()

time.sleep(2)

os.popen("killall top")

print process
Run Code Online (Sandbox Code Playgroud)

和第一个一样.它由于"readlines()"而被绞死

它的返回应该是这样的:

top - 05:31:15 up 12:12,  5 users,  load average: 0.25, 0.14, 0.11
Tasks: 174 total,   2 running, 172 sleeping,   0 stopped,   0 zombie
Cpu(s):  9.3%us, …
Run Code Online (Sandbox Code Playgroud)

python subprocess hung multiprocessor

14
推荐指数
1
解决办法
8684
查看次数

如何使用python 2.7.6进行subprocess.call超时?

可能有人问过,但是在使用python 2.7时我找不到任何关于subprocess.call超时的信息

python subprocess timeout python-2.7

12
推荐指数
2
解决办法
1万
查看次数

Python多处理模块:使用超时连接进程

我正在进行复杂模拟参数的优化.我使用多处理模块来增强优化算法的性能.我在http://pymotw.com/2/multiprocessing/basics.html上学到了多处理的基础知识.根据优化算法中给定的参数,复杂模拟持续不同的时间,大约1到5分钟.如果选择的参数非常糟糕,则模拟可持续30分钟或更长时间,结果无效.所以我在考虑在多处理的超时中构建,这会终止所有持续超过定义时间的模拟.这是问题的抽象版本:

import numpy as np
import time
import multiprocessing

def worker(num):

    time.sleep(np.random.random()*20)

def main():

    pnum = 10    

    procs = []
    for i in range(pnum):
        p = multiprocessing.Process(target=worker, args=(i,), name = ('process_' + str(i+1)))
        procs.append(p)
        p.start()
        print 'starting', p.name

    for p in procs:
        p.join(5)
        print 'stopping', p.name

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

该行p.join(5)定义了5秒的超时.由于for循环for p in procs:,程序等待5秒直到第一个进程完成,然后再等待5秒直到第二个进程完成,依此类推,但我希望程序终止所有持续超过5秒的进程.此外,如果所有进程的持续时间都不超过5秒,则程序不得等待5秒钟.

python timeout python-multiprocessing

11
推荐指数
2
解决办法
2万
查看次数

子进程超时失败

我想在子进程上使用超时

 from subprocess32 import check_output
 output = check_output("sleep 30", shell=True, timeout=1)
Run Code Online (Sandbox Code Playgroud)

不幸的是,虽然这会引发超时错误,但它会在30秒后发生.似乎check_output不能中断shell命令.

我可以在Python端做些什么来阻止它?我怀疑subprocess32无法终止超时进程.

python subprocess

11
推荐指数
1
解决办法
9590
查看次数

具有超时和大输出的python子进程(> 64K)

我想执行一个进程,以秒为单位将执行时间限制为一些超时并获取进程产生的输出.我想在windows,linux和freebsd上做这个.

我试过以三种不同的方式实现它:

  1. cmd - 没有超时和subprocess.PIPE用于输出捕获.

    行为:按预期运行但不支持超时,我需要超时...

  2. cmd_to - 使用timeout和subprocess.PIPE进行输出捕获.

    BEHAVIOR:当输出> = 2 ^ 16字节时阻止子进程执行.

  3. cmd_totf - 使用timeout和tempfile.NamedTemporaryfile进行输出捕获.

    行为:按预期运行,但在磁盘上使用临时文件.

这些可在下面获得进一步检查.

从下面的输出中可以看出,当使用子处理时,超时代码会阻止子进程的执行.PIPE和子进程的输出是> = 2 ^ 16字节.

子进程文档说明在调用process.wait()和使用subprocessing.PIPE时这是预期的,但是在使用process.poll()时没有给出警告,那么这里出了什么问题?

我在cmd_totf中有一个使用tempfile模块的解决方案,但权衡是它将输出写入磁盘,这是我真正想要避免的.

所以我的问题是:

  • 我在cmd_to做错了什么?
  • 有没有办法做我想要的,不使用临时文件/保持输出在内存中.

用于生成一堆输出的脚本('exp_gen.py'):

#!/usr/bin/env python
import sys
output  = "b"*int(sys.argv[1])
print output
Run Code Online (Sandbox Code Playgroud)

子处理周围包装器的三种不同实现(cmd,cmd_to,cmd_totf).Popen:

#!/usr/bin/env python
import subprocess, time, tempfile
bufsize = -1

def cmd(cmdline, timeout=60):
  """
  Execute cmdline.
  Uses subprocessing and subprocess.PIPE.
  """

  p = subprocess.Popen(
    cmdline,
    bufsize = bufsize,
    shell   = False,
    stdin   = subprocess.PIPE,
    stdout  = subprocess.PIPE,
    stderr  = subprocess.PIPE
  ) …
Run Code Online (Sandbox Code Playgroud)

python subprocess timeout

10
推荐指数
1
解决办法
8803
查看次数