9 命令执行
Zabbix 对外部检查、用户参数、 系统.run 监控项、自定义告警脚本、远程命令以及全局 脚本采用了通用的功能实现。
执行步骤
默认情况下,Zabbix 中的所有脚本均使用 sh shell 执行, 且无法修改默认 shell。若要使用其他 shell, 可以采用一种变通方法:create一个脚本file,并在执行命令时调用该脚本。
命令/脚本在 Unix 和 Windows 平台上均以类似方式执行:
- Zabbix(父进程)创建一个用于通信的管道
- Zabbix 将该管道设置为待创建子进程的输出
- Zabbix 创建子进程(运行命令/脚本)
- 为子进程创建一个新的进程组(在 Unix 上)或作业(在 Windows 上)
- Zabbix 从管道读取数据,直到发生超时或管道另一端无人写入 (所有句柄/file描述符均已关闭)。请注意,子进程可以create更多进程, 并在其退出或关闭句柄/file描述符之前退出。
- 如果未达到超时时间,Zabbix 将等待初始子进程退出或发生超时
- 如果初始子进程已退出且未达到超时时间,Zabbix 将检查初始子进程的退出代码, 并将其与 0 进行比较(非零值视为执行失败, 仅适用于自定义告警脚本、远程命令和在 Zabbix server 与 Zabbix proxy 上执行的用户脚本)
- 此时认为所有操作已完成,并终止整个进程树(即进程组或作业)
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."(当进程因未知原因终止时)。