python - 在 UWSGI 中创建的进程未在线程模式下完成
问题描述
我正在使用带有 uwsgi(2.0.17.1)、uwsgi-plugin-python2 (2.0.17) 和 Flask (1.0.2) 的 CentOS 7。
我有一个运行许多 shell 命令的烧瓶应用程序。其中一些无限期挂起。我在下面分享其中一个作为示例,它很容易复制。我在线程模式下使用 uwsgi。
#!/usr/bin/python
from flask import Flask
import subprocess
app = Flask(__name__)
@app.route("/test/")
def test():
print 'state 1'
p = subprocess.Popen(['ntpdate', '-u', '0.pool.ntp.org'],close_fds=True)
print 'state 2'
out, err = p.communicate()
print 'state 3'
print 'output: {}'.format(out)
print 'error: {}'.format(err)
return 'finish'
uwsgi 命令:
# uwsgi --ini uwsgi.conf --http-socket :8001
uwsgi 配置文件:
[uwsgi]
#virtual env's base folder
base = /root/plaground
home = /usr/
#cmd options
bin = /usr/sbin/uwsgi
#python module to import
module = app:app
pythonpath = /root/playground
catch-exceptions = true
plugins-dir = /usr/lib64/uwsgi/
plugins = python
need-app = true
master = true
threads = 10
启动 uwsgi 后,对 /test 路由的第一个请求成功完成,第二个停留在命令行执行并永久保持响应。
第一次调用输出:
state 1
state 2
21 Sep 16:02:48 ntpdate[19943]: adjust time server 78.46.53.11 offset -0.000224 sec
state 3
output: None
error: None
第二次调用输出:
state 1
state 2
第二次调用后的 ps aux 输出:
# ps aux | grep ntpdate
root 20820 0.0 0.0 23632 1516 pts/3 S<+ 16:03 0:00 ntpdate -u 0.pool.ntp.org
strace -p 20820 输出:
# strace -p 20820
strace: Process 20820 attached
restart_syscall(<... resuming interrupted call ...>) = 0
poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}], 2, 60000) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}], 2, 60000) = 0 (Timeout)
进程 fd 列表:
# ls -l /proc/20820/fd
total 0
lr-x------ 1 root root 64 Eyl 21 16:05 0 -> /dev/null
lrwx------ 1 root root 64 Eyl 21 16:05 1 -> /dev/pts/3
lrwx------ 1 root root 64 Eyl 21 16:03 2 -> /dev/pts/3
lrwx------ 1 root root 64 Eyl 21 16:05 3 -> socket:[463358]
lrwx------ 1 root root 64 Eyl 21 16:05 4 -> socket:[463359]
lsof 输出:
# lsof -p 20820
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpdate 20820 root cwd DIR 253,0 53 17726086 /root/playground
ntpdate 20820 root rtd DIR 253,0 244 64 /
ntpdate 20820 root txt REG 253,0 110240 224413 /usr/sbin/ntpdate
ntpdate 20820 root mem REG 253,0 106848 361769 /usr/lib64/libresolv-2.17.so
ntpdate 20820 root mem REG 253,0 31824 31549 /usr/lib64/libnss_dns-2.17.so
ntpdate 20820 root mem REG 253,0 62184 31551 /usr/lib64/libnss_files-2.17.so
ntpdate 20820 root mem REG 253,0 19896 142588 /usr/lib64/libattr.so.1.1.0
ntpdate 20820 root mem REG 253,0 90664 142317 /usr/lib64/libz.so.1.2.7
ntpdate 20820 root mem REG 253,0 19776 95386 /usr/lib64/libdl-2.17.so
ntpdate 20820 root mem REG 253,0 2173512 95380 /usr/lib64/libc-2.17.so
ntpdate 20820 root mem REG 253,0 20032 142590 /usr/lib64/libcap.so.2.22
ntpdate 20820 root mem REG 253,0 2512832 190324 /usr/lib64/libcrypto.so.1.0.2k
ntpdate 20820 root mem REG 253,0 164240 95374 /usr/lib64/ld-2.17.so
ntpdate 20820 root 0r CHR 1,3 0t0 5078 /dev/null
ntpdate 20820 root 1u CHR 136,3 0t0 6 /dev/pts/3
ntpdate 20820 root 2u CHR 136,3 0t0 6 /dev/pts/3
ntpdate 20820 root 3u sock 0,7 0t0 463358 protocol: UDP
ntpdate 20820 root 4u sock 0,7 0t0 463359 protocol: UDPv6
如果我尝试使用 shell 或 flask 内置 Web 服务器的 ntpdate 命令,则不会发生此问题。我在 uwsgi github ( https://github.com/unbit/uwsgi/issues/1034 ) 页面上发现了类似的问题,但是这个修复并没有解决我的问题。
我还使用 uwsgi 参数 close-on-exec 和 close-on-exec2 进行了尝试。这些也没有运气。
感谢您的帮助。
解决方案
推荐阅读
- c++ - DirectX11 的 .HLSL 和 .VS 和 .PS 代码有什么区别?
- authentication - gRPC 的基于令牌的身份验证是否会为每个调用添加元数据?
- redis - [ApacheBeam RedisIO]:过期时间不适用于 PFADD 写入方法
- python - if __name__ == "__main__": 和 Python 中的递归
- node.js - 用 NODE.js 在变量上多次替换字符串
- c++ - Poco::Foundation Target Not found with conan
- plsql - 无法在 SQL Developer 中运行教程过程:PLS-00103:遇到符号
- java - java - 如何在java中排除百分之五的数字
- python - modbus poll 跳转到异常只有没有错误?
- javascript - 如何限制反应原生谷歌地方自动完成到一个特定的大陆