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