2012-06-07 40 views
2

我有一个进程是通过subprocess.Popen()启动的,它意味着无限期地运行。我遇到的问题是这个过程似乎在大约20秒后停止运行。果然,当我检查top时,它表明该过程将要进入睡眠状态。当我手动运行命令时,这不会发生。以子进程模块启动的进程进入休眠状态

任何人都知道我可以如何阻止这种情况发生?

这是子电话:

aireplay = subprocess.Popen('aireplay-ng -3 -b ' + target.mac + ' ' + interface, 
          shell=True, stdout = subprocess.PIPE, stderr = DN) 

time.sleep(5) 
starttime = time.time() 
ivs = 0 
second = False 
print 'Sending deauth to generate arps...' 
send_deauth(target) 

while time.time() - starttime < 1200: 
    targets = parsecsvfile('crackattempt') 
    print 'Captured ' + str(ivs) + ' ivs.' 
    print aireplay.poll() 
    if len(targets[0]) > 0: 
     target = targets[0][0] 
     if ivs > 20000: 
      break 
     else : 
      ivs = int(target.ivs) 

    time.sleep(1) 
+0

如果您显示一些代码,人们将能够为您提供帮助。 – piokuc

+0

有关此过程正在执行的更多信息。睡觉前最后一件事是什么?它持续20秒吗?一直到代码中的某个点?始终如一地尝试使用特定的资源,数据结构等?这个过程是一个C程序,又一个Python,还是什么?等等 –

+0

对不起,我在上面添加了子进程调用。该流程(airmon-ng)在路由器上执行ARP重放攻击,即通过网卡来回发送和接收数据。它通常在10-30秒后发生。 – bananamana

回答

5

您管道子进程的输出。当它的缓冲区已满时它会休眠 - 你是否记得从子进程读取stdout?

如果您不介意阻塞,或者从stdout文件描述符读取,或者可能将stdout发送到/ dev/null,您可以使用communicate方法,因为您似乎没有使用它。

+0

谢谢,谢谢,谢谢!当缓冲区已满时,我不知道它睡了。我只是发送标准输出到/ dev/null,它的工作! – bananamana

相关问题