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

Python脚本读取监控系统外部参数异常问题求助

嘿,作为Python初学者遇到这种参数传递的问题很正常,我来一步步帮你解决!

首先得搞清楚:你的监控系统是把{HOST.NAME}这类参数怎么传给Python脚本的?一般监控系统(比如Zabbix、Nagios)要么用命令行参数,要么用环境变量来传递这些动态值——这两种情况的处理方式不一样,我分别给你讲:


情况1:监控系统通过命令行参数传递变量

如果监控系统调用你的脚本时是类似这样的格式:

python your_alert_script.py "{HOST.NAME}" "{SERVICE.STATUS}"

那你可以用Python的sys模块来获取这些参数,示例代码已经整合了纯文本+HTML邮件的逻辑:

import sys
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 从命令行获取参数:sys.argv[0]是脚本本身的名字,后面的才是传入的变量
# 这里假设监控系统传了两个参数:第一个是HOST.NAME,第二个是服务状态
try:
    host_name = sys.argv[1]
    service_status = sys.argv[2]
except IndexError:
    # 防止参数没传全的情况,给个默认值
    host_name = "未知主机"
    service_status = "未知状态"

# 构建多格式邮件
msg = MIMEMultipart('alternative')
msg['Subject'] = f"⚠️ 服务告警:{host_name} 服务异常"
msg['From'] = "你的告警邮箱@xxx.com"
msg['To'] = "收件人邮箱@xxx.com"

# 纯文本版本邮件内容
text_content = f"""
您好,
{host_name} 上的服务状态为 {service_status},请及时排查处理!
"""

# HTML版本邮件内容(可以加样式让告警更醒目)
html_content = f"""
<html>
  <body style="font-family: Arial, sans-serif;">
    <h3 style="color: #dc3545;">⚠️ 服务告警通知</h3>
    <p>您好:</p>
    <p>主机 <strong>{host_name}</strong> 上的服务状态为 <strong style="color: #dc3545;">{service_status}</strong>,请及时排查处理!</p>
  </body>
</html>
"""

# 把两种格式的内容添加到邮件里
part_plain = MIMEText(text_content, 'plain', 'utf-8')
part_html = MIMEText(html_content, 'html', 'utf-8')
msg.attach(part_plain)
msg.attach(part_html)

# 发送邮件(这里用普通SMTP,如果你用企业邮箱可能需要调整端口/加密方式)
with smtplib.SMTP('smtp.xxx.com', 587) as smtp_server:
    smtp_server.starttls()  # 启用TLS加密
    smtp_server.login("你的告警邮箱@xxx.com", "邮箱授权码")  # 注意用授权码不是密码!
    smtp_server.sendmail(msg['From'], msg['To'], msg.as_string())

小提示:

你可以先手动测试一下:在命令行输入python your_alert_script.py "Ubuntu 1" "DOWN",看看脚本能不能正确打印出host_name和service_status(可以加一行print(host_name, service_status)在代码里)。


情况2:监控系统通过环境变量传递变量

有些监控系统会把{HOST.NAME}这类参数转换成环境变量(比如变成HOST_NAME或者HOST_NAME),这时候用os模块来读取:

import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 读取环境变量,用get方法可以设置默认值,避免变量不存在时报错
host_name = os.environ.get('HOST_NAME', '未知主机')
service_status = os.environ.get('SERVICE_STATUS', '未知状态')

# 后面的邮件构建和发送逻辑和上面完全一样,就不重复写了

测试方法:

先在命令行设置环境变量再运行脚本:

export HOST_NAME="Ubuntu 1"
export SERVICE_STATUS="DOWN"
python your_alert_script.py

看看能不能正确获取到值。


关键排查点

  1. 先确认监控系统的参数传递方式:查一下监控系统的文档,或者问问运维同事,{HOST.NAME}是通过命令行还是环境变量传给脚本的?
  2. 先不要急着发邮件,先把参数打印出来确认值是否正确,再整合到邮件内容里。
  3. 如果参数里有特殊字符(比如空格、中文),确保脚本用的是UTF-8编码(代码里已经加了utf-8参数,一般没问题)。

内容的提问来源于stack exchange,提问作者Melanchole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:06:50