我正在尝试从CGI Python脚本在后台运行另一个python脚本,并希望这个脚本能够在后台运行进程,而无需等待其他脚本的完成。不知为何,当我在Linux中运行相同的脚本时,我可以在后台运行另一个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,而无需等待它完成。
发布于 2019-05-23 00:44:43
and服务器将保持客户端响应活动(导致客户端处于“加载”状态),直到收集了来自CGI程序的所有输出并将其转发给客户端。way服务器知道所有输出已经被收集的方式是它看到CGI进程的标准输出流正在关闭。这通常发生在CGI进程退出时。
出现此问题的原因是,当subprocess.Popen被告知使用stdout=None执行程序时,生成的程序将共享其父程序的标准输出流。这里,这意味着您的后台程序共享CGI进程的标准输出。这意味着从the服务器的角度来看,流一直处于打开状态,直到两个进程都退出为止。
若要修复,请使用stdout=subprocess.PIPE启动后台进程。如果背景进程在CGI进程死后其stdout关闭,则尝试使用stdout=open('/dev/null')启动它。
后台进程的stdin和stderr将有相同的问题;它们将与CGI进程共享。只要后台进程不尝试从它的标准输入中读取,AFAIK共享这些就不会带来麻烦,但是如果它这样做了(或者您只是想要谨慎),您可以像对待stdout一样对待它们,或者将它们设置为subprocess.PIPE,或者将它们与/dev/null关联起来。
更多细节见https://docs.python.org/2/library/subprocess.html#popen-constructor
https://stackoverflow.com/questions/56261101
复制相似问题