9 命令执行

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 服务器和 Zabbix proxy 上执行的自定义告警脚本、远程命令和用户脚本。
  • 任何不等于 0 的退出代码都被视为执行失败。
  • 对于执行失败的情况,会收集标准错误和标准输出的内容,并可在前端中查看(显示执行结果的位置)。
  • 通过在 agent/proxy 上启用 LogRemoteCommands 参数,可为在 Zabbix agent/proxy 上执行的远程命令创建额外的日志条目。

对于失败的命令/脚本,前端中可能显示的消息和日志条目包括:

  • 执行失败时的标准错误和标准输出内容(如有)。
  • “进程已退出,代码:N。”(当输出为空且退出代码不等于 0 时)。
  • “进程被信号终止:N。”(当进程被信号终止时,仅适用于 Linux)。
  • “进程意外终止。”(当进程因未知原因终止时)。

另请参见