繁体   English   中英

将后台进程的 output 记录到文件中

[英]Log output of background process to a file

我有耗时的 SNMP walk 任务来执行,我使用 Popen 命令作为后台进程运行。 如何在日志文件中捕获此后台任务的 output。 在下面的代码中,我尝试对 ip_list 中的每个 IP 进行 snampwalk,并将所有结果记录到 abc.txt。 但是,我看到生成的文件 abc.txt 是空的。

这是我下面的示例代码 -

import subprocess
import sys

f = open('abc.txt', 'a+')

ip_list = ["192.163.1.104", "192.163.1.103", "192.163.1.101"]

for ip in ip_list:
    cmd = "snmpwalk.exe -t 1 -v2c -c public "
    cmd = cmd + ip
    print(cmd)
    p = subprocess.Popen(cmd, shell=True, stdout=f)
    p.wait()
f.close()

print("File output - " + open('abc.txt', 'r').read())

对于每个 IP,命令中的示例 output 可以是这样的 -

sysDescr.0 = STRING: Software: Whistler Version 5.1 Service Pack 2 (Build 2600)
sysObjectID.0 = OID: win32
sysUpTimeInstance = Timeticks: (15535) 0:02:35.35
sysContact.0 = STRING: unknown
sysName.0 = STRING: UDLDEV
sysLocation.0 = STRING: unknown
sysServices.0 = INTEGER: 72
sysORID.4 = OID: snmpMPDCompliance 

我已经尝试过 Popen。 但如果它是一个耗时的后台进程,它不会将 output 记录到文件中。 但是,当我尝试运行 ls/dir 之类的后台进程时,它可以工作。 任何帮助表示赞赏。

这里的主要问题是对Popen所做的事情以及我假设的工作方式的期望。 这里的p.wait()将等待进程完成,然后再继续,这就是为什么ls例如可以工作,但更耗时的任务却不能。 在您调用p.stdout.flush()之前,不会自动刷新 output 。

您设置它的方式更适用于:

  1. 执行命令
  2. 等待退出
  3. 抓output

然后使用它。 对于您的用例,您最好使用替代库使用stdout=subprocess.PIPE并自己抓住它。 这将意味着以下内容:

import subprocess
import sys

ip_list = ["192.163.1.104", "192.163.1.103", "192.163.1.101"]
with open('abc.txt', 'a+') as output:
    for ip in ip_list:
        print(cmd := f"snmpwalk.exe -t 1 -v2c -c public {ip}")
        process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) # Be wary of shell=True
        while process.poll() is None:
            for c in iter(lambda: process.stdout.read(1), ''):
                if c != '':
                    output.write(c)

with open('abc.txt', 'r') as log:
    print("File output: " + log.read())

这里要带走的关键是process.poll()检查进程是否完成,如果没有,我们将尝试使用process.stdout.read(1)捕获 output 以一次读取一个字节。 如果您知道有新的行来了,您可以将这三行切换到output.write(process.stdout.readline())并且一切就绪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM