在后台运行一个shell命令,并使用python将stdout传递给一个日志文件

时间:2018-02-08 21:08:48

标签: python shell subprocess popen

我有一个.war文件我想通过python启动。我希望它在后台中运行,因此我的终端中不会显示任何日志消息。此外,我希望将实际的日志输出放入日志文件中。这是我用来解决这个问题的python代码。

我没有运气。该进程分离,因为在执行脚本后我无法运行其他shell命令。创建了日志文件,但在那里附加了没有日志输出。

编辑:让事情变得更清晰。我想增强这个脚本,最终运行多个java进程。因此,这个python脚本应该生成那些java进程并最终死掉。如何实现包括将 stdout 重定向到文件的功能?

#!/usr/bin/env python3
import subprocess
import re

platformDir = "./platform/"

fe = "frontend-webapp-0.5.0.war"
logfile = open("frontend-log", 'w')

process = subprocess.Popen(['java', '-jar', platformDir + fe], 
stdout=subprocess.PIPE)

for line in process.stdout:
        logFile.write(line)

2 个答案:

答案 0 :(得分:1)

以下是使用Python 3进行尝试的方法:

import sys
from subprocess import Popen, PIPE, STDOUT

platformDir = "./platform/"

fe = "frontend-webapp-0.5.0.war"

logfile = open("frontend-log", 'ab')

p = Popen(['java', '-jar', platformDir + fe], stdout=PIPE, stderr=STDOUT, bufsize=1)

for line in p.stdout: 
    sys.stdout.buffer.write(line) 
    logfile.write(line)

答案 1 :(得分:0)

我实际上只需要给stdout提供像stdout=logFile这样的文件句柄。带有for循环通过stdout的解决方案会让我一直处于python脚本进程中

import sys
from subprocess import Popen, PIPE, STDOUT

platformDir = "./platform/"

fe = "frontend-webapp-0.5.0.war"

logfile = open("frontend-log", 'ab')

p = Popen(['java', '-jar', platformDir + fe], stdout=logfile, stderr=STDOUT, bufsize=1)