9 命令执行

Zabbix 使用统一的外部检查功能,包括用户参数、监控项系统运行命令、自定义告警脚本、远程命令以及全局脚本。

执行步骤

默认情况下,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 agent/proxy上执行的远程命令,可通过在agent/proxy中启用LogRemoteCommands参数来创建额外的日志条目。

命令/脚本失败时可能的前端消息和日志条目: