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 上的远程命令,将创建额外的日志条目以保存脚本执行输出,可以使用 LogRemoteCommands agent 参数 启用。

前端消息和日志可能出现的失败命令/脚本:

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

另请参阅