在日志中找到特定字符串时停止子进程

时间:2018-12-21 18:50:59

标签: python ethereum

这是有关子流程的问题。

我正在使用此异步脚本来完成一些工作:https://github.com/ethereum/trinity/blob/master/scripts/peer.py

脚本的功能与我使用该脚本的方式无关。

由于它是异步的,因此我想在具有不同值的子进程中运行它,并且对于每个子进程,我想等待一定的超时时间,然后再检查脚本日志中的字符串。如果找到要查找的字符串,则退出该参数传递的子过程,然后传递一个新参数,重复该过程。

从高层次来看,这是我正在尝试的子流程脚本。

import subprocess
enode = 'enode://ecd3f3de6fc1a69fdbb459ccfeedb9ae4b@127.0.0.1:30303'

command = [
   'python',
   '-m',
   'scripts.peer',
   '-mainnet',
   '-enode',
   enode
]
proc = subprocess.Popen(command)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()
    print(outs)
    print(errs)

此代码无效,并且永远不会退出脚本。如何在异步脚本中使用子流程,以便当我在子流程的日志中grep一个值并找到我要查找的值时将其暂停。

我要查找的日志中的字符串是:failed DAO fork check validation,我将其用作停止脚本的触发器。

1 个答案:

答案 0 :(得分:0)

您需要将子流程的输入和错误流显式设置为subprocess.PIPE以便从中读取。

# ...
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)