python - atexit/sigterm 触发的函数未在终止的进程上调用
问题描述
我有一个烧瓶server
,它使用子进程模块运行另一个 python script
(特别是另一个烧瓶服务器)。
在 上script
,我添加了一个侦听器以在调用 process.terminate() (终止)SIGMTERM, SIGINT, SIGBART
时调用退出处理程序。但是,侦听器从不调用退出处理程序。server
script
这是一个示例代码:
服务器:
import subprocess
import os
import shlex
import time
command = shlex.split('python3 /path/to/script.py')
env = os.environ.copy()
env['MY_APP_NAME'] = "myappnameyes"
del env["WERKZEUG_SERVER_FD"]
process = subprocess.Popen(command,
shell=False,
env=env,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
time.sleep(10)
process.terminate()
脚本(这是一个 Flask 服务器):
# script.py
from src.utils import termination
from flask import Flask
app = Flask(__name__)
# Some flask routes...
if __name__ == '__main__':
app.run()
终止.py:
import signal
import sys
import os
def exit_handler(*args):
os.makedirs('/Users/galshahar/Desktop/PychramProjects/flask_ser/output', exist_ok=True)
# atexit.register(exit_handler) # Tried it also but also does not work
for sig in (signal.SIGABRT, signal.SIGINT, signal.SIGTERM):
print(f"Registered {str(sig)}", file=sys.stderr)
signal.signal(sig, exit_handler)
如果我直接运行 script.py,它会按预期将这些打印到 stderr 并调用exit_handler
创建“输出”目录:
Registered Signals.SIGABRT
Registered Signals.SIGINT
Registered Signals.SIGTERM
但是当我将它server
作为子进程运行然后调用process.terminate()
时,exit_handler
永远不会被调用。我也试过用atexit,也是,没有成功。
我不确定我在这里遗漏了什么,现有的答案没有用......
有任何想法吗?谢谢!
解决方案
推荐阅读
- angular - 当接收组件尚未加载时,无法使用服务将数据从一个组件传递到另一个组件
- excel - 如何在excel中提取不同的行?
- xpath - 努力从 BarChart 网站导入
- django - 在不通过 url.py 的情况下调用基于类的视图 (POST) 方法
- codeigniter - 父控制器函数调用取决于http方法?
- airflow - 如果气流中的 DAG 有 10 个任务并且在第 5 个任务中失败,那么当再次触发 dag 时,如何确保它从中间的第 5 个任务开始?
- java - Java Hibernate - 查询中的括号错误
- liquibase - 从 3.5.5 迁移到 3.6.0 或更高版本时,Liquibase 更新非常慢
- android - 仅当 minifyEnabled 和 LifeCycle v 2.1.0 时应用程序在创建 ViewModel 时崩溃
- nginx - 有没有办法使用 Nginx 创建点对点(每个客户端 1 个服务器)连接?