【问题标题】:run a shell command in the background and pipe stdout to a logfile with python在后台运行 shell 命令并使用 python 将标准输出通过管道传输到日志文件
【发布时间】:2018-07-19 13:45:49
【问题描述】:

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

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

编辑:让事情更清楚。我想增强这个脚本最终运行多个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)

【问题讨论】:

    标签: python shell subprocess popen


    【解决方案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)
    

    【讨论】:

    • 这几乎奏效了。我删除了sys.stdout.buffer.write(line),因为我不希望在日志文件之外的其他地方呈现任何输出。现在正在填充日志文件。 该进程仍未在后台运行。运行该过程后,我无法继续在当前 shell 中工作。当我按CTRL-C 时,我中止了应用程序。 如何分离进程?
    • 能否尝试在脚本末尾添加p.wait() 看看是否有效?你也可以在linux中使用screen命令来分离。
    • 不,遗憾的是没有工作。当我CTRL-C 中止进程时,过程与上述相同。
    • nohup python script_name.py & 这将分离您的进程。
    • 我想以./run-all.py 的身份运行我的脚本。然后它将启动大约 5 个我都想在后台分离/运行的 java 进程。您的解决方案可以工作,但这不是我希望我的脚本工作的方式。还是谢谢!
    【解决方案2】:

    实际上,我只需将文件句柄提供给 stdout,例如 stdout=logFile。通过标准输出使用 for 循环的解决方案会让我一直处于 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)
    

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多