2022 Zabbix中国峰会
2022 Zabbix中国峰会

10 命令执行

Zabbix 使用外部检查,用户参数, system.run 监控项,自定义警报脚本, 远程命令和用户脚本的通用功能。

执行步骤

默认情况下,Zabbix中的所有脚本都是使用 sh shell执行的,并且无法修改默认shell。 要使用不同的 shell,您可以采用一种解决方法: 创建一个脚本文件并在命令执行期间调用该脚本。

命令/脚本在 Unix 和 Windows 平台上的执行方式类似:

  1. Zabbix(父进程)创建一个用于通信的管道
  2. Zabbix将管道设置为待创建的子进程的输出
  3. Zabbix创建子进程(运行命令/脚本)
  4. 为子进程创建新的进程组(在 Unix 中)或作业(在 Windows 中)
  5. Zabbix从管道中读取,直到发生超时 或没有数据写入另一端(所有句柄/文件描述符都已关闭)。 请注意,子进程可以创建更多进程, 并在退出或关闭句柄/文件描述符之前退出。
  6. 如果没有发生超时, Zabbix会一直等待,直到初始子进程退出或发生超时
  7. 如果初始子进程退出且未发生超时, Zabbix会检查初始子进程的退出代码, 并将其与0进行比较(非零值被视为执行失败, 仅适用于在Zabbix server和Zabbix proxy上执行的自定义告警脚本、远程命令和用户脚本)
  8. 此时,如果所有操作都已完成,整个过程树(即过程组或作业)终止

Zabbix 中,初始子进程已退出,并且没有其他进程仍保持输出句柄/文件描述符打开状态时,则判断命令/脚本已经完成了处理。 处理完成后,所有创建的进程都会被终止。

命令中的所有双引号和反斜杠都使用反斜杠进行转义,并且命令用双引号括起来。

退出代码的检查

在以下条件下检查退出代码:

  • 仅适用于在Zabbix server 和 Zabbix proxy上执行的自定义告警脚本,远程命令和用户脚本。
  • 任何不为0的退出代码都被视为执行失败。
  • 收集失败执行的标准错误和标准输出的内容,并在前端(显示执行结果)中提供。
  • 为 Zabbix server 上的远程命令创建附加日志条目以保存脚本执行输出,并可使用 agent 端的 LogRemoteCommands 参数启用。

可能出现的失败指令/脚本的前端信息和日志条目:

  • 执行失败的标准错误和标准输出的内容(如果有的话)
  • "进程退出代码:N。"(对于空输出,退出代码不等于0)。
  • "进程被信号杀死:N。"(对于由信号终止的进程,仅在Linux上)。
  • "进程意外终止。"(由于未知原因终止进程)。

另请参阅