命令执行
Zabbix 对外部检查、用户参数、system.run 监控项、自定义告警脚本、远程命令和全局脚本使用通用功能。
所有命令和脚本均以运行 Zabbix agent 的操作系统用户权限执行。 该用户必须具有执行命令或脚本所需的足够权限。
执行步骤
默认情况下,Zabbix 中的所有脚本都使用 sh shell 执行,且无法修改默认 shell。 如需使用其他 shell,可以采用一种变通方法:创建脚本文件,并在执行命令时调用该脚本。
在 Unix 和 Windows 平台上,命令或脚本的执行方式类似:
- Zabbix(父进程)创建用于通信的管道。
- Zabbix 将该管道设置为即将创建的子进程的输出。
- Zabbix 创建子进程(运行命令/脚本)。
- 为子进程创建新的进程组(在 Unix 中)或作业(在 Windows 中)。
- Zabbix 从管道读取数据,直到发生超时,或没有任何进程继续向另一端写入数据(所有句柄/文件描述符均已关闭)。 请注意,子进程可以创建更多进程,并在这些进程退出或关闭句柄/文件描述符之前退出。
- 如果尚未达到超时时间,Zabbix 将等待初始子进程退出或发生超时。
- 如果初始子进程在达到超时时间之前退出,Zabbix 将检查初始子进程的退出代码,并将其与
0进行比较。 非零退出代码将被视为执行失败,但仅适用于在 Zabbix 服务器或 Zabbix proxy 上执行的自定义告警脚本、远程命令和用户脚本。 - 此时,系统将认为所有操作均已完成,并终止整个进程树(即进程组或作业)。
当初始子进程已退出,并且没有其他进程仍保持输出句柄/文件描述符处于打开状态时,Zabbix 将认为命令/脚本已完成处理。 处理完成后,所有已创建的进程都会被终止。
命令中的所有双引号和反斜杠都会使用反斜杠进行转义,并且命令会置于双引号中。
退出代码检查
退出代码根据以下条件进行检查:
- 仅适用于在 Zabbix 服务器和 Zabbix proxy 上执行的自定义告警脚本、远程命令和用户脚本。
- 任何不等于
0的退出代码都视为执行失败。 - 对于执行失败的操作,会收集标准错误和标准输出的内容,并可在前端中查看(显示执行结果的位置)。
- 对于在 Zabbix agent/proxy 上执行的远程命令,可以通过在 agent/proxy 上启用 LogRemoteCommands 参数来创建额外的日志条目。
失败命令或脚本可能显示的前端消息和日志条目:
- 执行失败时的标准错误和标准输出内容(如果有)。
Process exited with code: N.(输出为空且退出代码不等于0时)。Process killed by signal: N.(进程被信号终止时,仅适用于 Linux)。Process terminated unexpectedly.(进程因未知原因意外终止时)。