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 server和Zabbix proxy上执行的用户脚本。
  • 任何不同于0的退出代码都被视为执行失败。
  • 失败执行的标准错误和标准输出内容被收集,并在前端(显示执行结果的地方)可用。
  • 可以通过在agentproxy上启用LogRemoteCommands参数,为在Zabbix agent和proxy上执行的远程命令创建额外的日志条目。

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

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

另请参阅