2017-08-01 122 views
0

我试图通过一个python脚本,即'ifconfig -a eht0'在linux机器上获取网络接口的信息。所以我用下面的代码:Python:从后台子进程获取标准输出

import subprocess 
proc = subprocess.Popen('ifconfig -a eth0', shell=True, stdout=subprocess.PIPE) 
proc.wait() 
output = proc.communicate()[0] 

那么,如果我执行从终端的脚本

python myScript.py 

python myScript.py & 

它工作正常,但在运行时从后台(由crontab启动)没有活动外壳,我无法得到输出。

有什么想法?

谢谢

+1

你怎么用'output'来查看它是否有效(无论是在后台还是在主动shell)?你把它保存到一个文件?如果是这样,文件是否被创建,但没有内容或根本没有文件? –

+0

如果你不设置'shell = True',比如'proc = subprocess.Popen(['ifconfig','-a','eth0'],stdout = subprocess.PIPE)''是否有区别? –

+0

输出被发送到远程数据库,并且当它从终端运行时,我可以读取数据。虽然如果我使用'shell = False'我得到这个错误'OSError:[Errno 2]没有这样的文件或目录' – user3734366

回答

1

您是否试过使用“屏幕”?

proc = subprocess.Popen('screen ifconfig -a eth0', shell=True, stdout=subprocess.PIPE) 

我不确定它是否可以正常工作。

+0

如果你不确定它应该是一个评论,而不是一个答案 –

+0

SO用户少50以上的声望无法评论他人的帖子。 – orangeInk

+0

是的,我无法评论。我以前遇到过同样的问题。该解决方案为我工作。但我不确定它是否适用于其他人 – Toandd

0

尝试proc.stdout.readline()而不是沟通,subprocess.Popen()中的stderr = subprocess.STDOUT可能会有所帮助。请发布结果。

+0

从终端启动脚本会给出'eth0 Link encap:Ethernet HWaddr 18:b2:23:a4:12:1e'而不是完整的输出,并且如果由cron运行,它会再次提供空字符串。 – user3734366

+0

我建议你使用proc.communicate。你有没有试过用2>&1重定向标准错误输出? –

+0

也尝试从crontab调用脚本,并在调用脚本的行重定向输出(可能相关,我不是一个强大的crontab用户[link](https://unix.stackexchange.com/questions/) 52330 /如何对重定向输出到一个文件从 - 内 - 的cron) –

0

我发现问题的解决方案,我猜系统无法识别由crontab执行的功能ifconfig。因此,添加子进程的完整路径允许脚本正确执行:

`proc = subprocess.Popen('/sbin/ifconfig -a eth0',shell=True,stdout=subprocess.PIPE) 
proc.wait() 
output = proc.communicate()[0]` 

现在我可以管理输出字符串。

谢谢

相关问题