You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:50:01