【问题标题】:When using the python script as CGI, Subprocess Popen not able to run background process使用 python 脚本作为 CGI 时,子进程 Popen 无法运行后台进程
【发布时间】:2019-05-22 16:14:56
【问题描述】:

我正在尝试从 CGI python 脚本在后台运行另一个 Python 脚本,并希望该脚本在后台运行该进程而无需等待其他脚本完成。不知何故,当我从 Linux shell 运行相同的程序时,我可以在后台运行其他 python 脚本。但是当我尝试通过 CGI 做同样的事情时,前端会一直加载直到另一个脚本完成,而不仅仅是让它在后台运行。

我已经尝试在 Linux Shell 上运行相同的程序并且它可以工作。当我切换到 CGI 时,脚本等待其他进程完成。

python1.py:

command = [sys.executable,'python2.py', str(senddata)]
proc=subprocess.Popen(command,shell=False,stdin=None,stdout=None,stderr=None,close_fds=True)

print("Content-type: text/html\r\n\r\n")

print("The script is running in background! Expect an email in 10 minutes.")

python2.py: 此脚本需要 2-5 分钟才能执行,然后向群组发送电子邮件。

预期的输出是有这个消息:

脚本正在后台运行!预计 10 分钟后会收到一封电子邮件。

并在后台运行 python2.py 而无需等待它完成。

【问题讨论】:

    标签: python apache cgi


    【解决方案1】:

    网络服务器将保持客户端响应处于活动状态(使客户端保持“加载”状态),直到 CGI 程序的所有输出都被收集并转发给客户端。网络服务器知道所有输出已被收集的方式是它看到 CGI 进程的标准输出流被关闭。这通常在 CGI 进程退出时发生。

    您遇到此问题的原因是当subprocess.Popen 被告知使用stdout=None 执行程序时,生成的程序将共享其父级的标准输出流。这意味着您的后台程序共享 CGI 进程的标准输出。这意味着从网络服务器的角度来看,该流保持打开状态,直到 两个 进程退出。

    要解决此问题,请使用 stdout=subprocess.PIPE 启动后台进程。如果后台进程在 CGI 进程终止时其标准输出关闭时出现异常,请尝试使用 stdout=open('/dev/null') 启动它。

    后台进程的stdinstderr会有同样的问题;它们将与 CGI 进程共享。只要后台进程不尝试从其标准输入中读取,AFAIK 共享这些就不会造成麻烦,但如果它确实这样做(或者如果您只是想谨慎),您可以像对待 @ 一样对待它们987654328@ 并将它们设置为 subprocess.PIPE 或将它们与 /dev/null 关联。

    更多详情请访问https://docs.python.org/2/library/subprocess.html#popen-constructor

    【讨论】:

    • 感谢您的指导。使用 stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE 解决了该问题
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2013-08-09
    • 1970-01-01
    • 2021-04-02
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多