9 命令执行

Zabbix 对外部检查、用户参数、 系统.run 监控项、自定义告警脚本、远程命令以及全局 脚本采用了通用的功能实现。

执行步骤

默认情况下,Zabbix 中的所有脚本均使用 sh shell 执行, 且无法修改默认 shell。若要使用其他 shell, 可以采用一种变通方法:create一个脚本file,并在执行命令时调用该脚本。

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

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

Zabbix 认为当初始子进程退出且没有其他进程仍在保持输出句柄/file描述符打开时, 命令/脚本已完成处理。处理完成后,所有创建的进程都将被终止。

命令中的所有双引号和反斜杠均使用反斜杠进行转义,且命令整体被双引号包围。

退出码检查

退出代码检查包含以下条件:

  • 仅适用于在 Zabbix server 和 Zabbix proxy 上执行的自定义告警脚本、远程命令和用户脚本。
  • 任何与 0 不同的退出代码均被视为执行失败。
  • 失败执行的标准错误和标准输出内容将被收集,并可在前端查看(执行结果显示位置)。
  • 日志远程命令/日志远程命令 上启用 LogRemoteCommands 参数后,可能会为在 Zabbix agent/proxy 上执行的远程命令创建额外的日志条目。

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

  • 失败执行的标准错误和标准输出内容(如有)。
  • "Process exited with code: N."(当输出为空且退出代码不等于 0 时)。
  • "Process killed by signal: N."(当进程被信号终止时,仅限 Linux)。
  • "Process terminated unexpectedly."(当进程因未知原因终止时)。

另请参阅