我使用 Zabbix 来监控我的服务器,最近我想为 Windows 的服务器添加更多指标。出于安全考虑,我使用了 Zabbix 的用户参数功能,但它将外部命令的执行时间限制在 3 秒左右。之后,命令被强行杀死。
我想运行一些长时间运行的命令,所以我使用了 Zabbix 论坛中的技巧:在后台运行命令,将结果写入文件并使用 Zabbix 收集它们。
由于“&”运算符,这在 *nix 下相当容易,但 Windows 的 shell 中没有这样的支持。更糟糕的是,当 Zabbix kills 强行杀死cmd.exe
它用来评估命令的程序时,所有子进程都会死亡,包括未完成的后台任务。
因此,我需要一些可以切断与其孩子的所有联系的东西,这样他们就不会在级联杀戮中受到影响。
start
并且start /B
- 他们什么都不做,因为孩子总是和父母一起死去wscript
进程被强行终止而不是自行退出,那么孩子们也会死亡。hstart
- 与 invis.vbs 类似的结果At
命令 - 这需要您为任务设置一个绝对时间,而不是偏移量,因此由于 Windows 的 shell 脚本功能有限,代码会非常混乱。PsExec.exe
来自 SysInternals 套件 - 它使用服务来启动命令,因此它不受杀死的影响;但是,它会向 StdErr 打印一些横幅和日志信息,并且没有禁用此功能的开关。当我2>NUL
用来重定向它们时,Zabbix 报告错误。在以不同的组合尝试上述操作后,我注意到如果我调用hstart
from invis.vbs
,前者启动的命令在invis.vbs
被杀死时将作为无父进程单独存在。
但是,由于我需要重定向输出,因此我要运行的命令始终采用cmd.exe /c ""command" "args"" >log
. vbs 还删除了所有引号,因此我必须使用自定义转义序列对命令进行编码。最终结果涉及大约五个级别的转义/引用,这几乎不可能维持。
有人知道更好的解决方案吗?
归档时间: |
|
查看次数: |
6730 次 |
最近记录: |