32 lines
1.3 KiB
Python
32 lines
1.3 KiB
Python
"""程序入口:系统调用监控器主启动脚本。
|
||
|
||
由于 eBPF 需要内核能力(CAP_BPF/root),本脚本必须以 root 权限运行。
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
|
||
# 引入 Flask 应用,用于创建 Web 服务实例
|
||
from web.app import create_app
|
||
|
||
|
||
def main():
|
||
# 校验运行权限:eBPF 需要 root 或 CAP_BPF 能力,否则无法挂载内核探针
|
||
if os.geteuid() != 0:
|
||
print("错误:必须以 root 权限运行(eBPF 需要 CAP_BPF/root 权限)", file=sys.stderr)
|
||
sys.exit(1)
|
||
|
||
# 创建 Flask 应用并从环境变量读取监听地址与端口(默认 0.0.0.0:5000)
|
||
app = create_app()
|
||
host = os.environ.get("HOST", "0.0.0.0")
|
||
port = int(os.environ.get("PORT", "5000"))
|
||
|
||
# 启动 Web 服务:关闭 debug 与 reloader,避免 eBPF 探针被重复加载;开启多线程以并发处理请求
|
||
# use_reloader=False 是关键,Flask 的自动重载机制会导致主进程被 fork 两次,从而导致 eBPF 探针被加载两次,产生冲突和错误
|
||
# thearded=True 是可选的,默认情况下,Flask 会在多线程中运行,但 eBPF 探针不能在多线程中运行
|
||
app.run(host=host, port=port, debug=False, use_reloader=False, threaded=True)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|