Linux下Python脚本调用Zabbix时sys.stdin为None引发AttributeError求助
解决方案:Zabbix调用Python脚本时sys.stdin为None导致的AttributeError
问题核心
Zabbix调用外部Python脚本时,sys.stdin会周期性变为None,导致daemon库初始化时触发AttributeError: 'NoneType' object has no attribute 'fileno',脚本运行不稳定。
可行解决办法
1. 强制指定daemon分离进程,跳过检查
在初始化DaemonContext时直接设置detach_process=True,绕开daemon库对启动进程的检查逻辑,避免访问无效的sys.__stdin__:
try: with daemon.DaemonContext(detach_process=True): run_main_function() except: print(sys.stdin) print(format_exc())
2. 提前修复stdin指向
在导入daemon库前,先将sys.stdin重定向到/dev/null(如果它为None),确保有有效的文件描述符:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import os # 修复stdin,避免为None if sys.stdin is None: sys.stdin = open(os.devnull, 'r') import daemon from traceback import format_exc def run_main_function(): print("Hello") try: with daemon.DaemonContext(): run_main_function() except: print(sys.stdin) print(format_exc())
3. 移除daemon化逻辑(推荐)
Zabbix外部脚本是由agent调用的短生命周期进程,通常不需要后台守护。如果业务不需要脚本长期运行,直接去掉daemon相关代码:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys from traceback import format_exc def run_main_function(): print("Hello") try: run_main_function() except: print(sys.stdin) print(format_exc())
原因说明
Zabbix Agent在调用外部脚本时,部分场景下会关闭标准输入流(如批量执行任务、系统资源紧张时),导致sys.stdin变为None。而daemon库的初始化逻辑会尝试读取sys.__stdin__的文件描述符来判断进程启动方式,此时就会触发属性错误。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

