2018年4月23日 星期一
08:17
其实脚本早就写好了,但是一直没有根据知识体系进行拆分(我都写到一块去了)
需求
需要监控Windows中计划任务的执行状态,主要包括上一次的执行结果和计划任务状态。如下图所示。
思路
计划任务的监控很简单也可以很难。简单在于你可以直接监控某任务,复杂在于自动发现并进行监控。
和运维人员了解了下,大家监控的计划任务不止一个,为了省时省力,减少配置工作量,所以计划采用自动发现的方式来监控了。
上面这条的主要原因就是,端口监控被团队的一个人员搞得惨不忍睹。
自动发现(Discover)
如何进行自动发现,这是个Zabbix的词汇,也暴露了我们内部使用的监控系统了。
Zabbix自动发现原理就是调用Agent一个Key,Agent返回自动发现脚本执行的结果。
通常,自动发现的结果如下,是个JSON格式的东东:
{
"data" : [
{"{#NAME}": "Name1"},
{"{#NAME}": "Name2"}
]
}
这里的{#NAME}
就是我们在Zabbix中要引用的Key,我们要保证尽量不重名(虽然没这个规定,但是没看过代码,不确定Zabbix会不会抽个疯)。
我这里计划返回的结果是这样子的:
{
"data" : [
{"{#SCHTASKNAME}": "TaskName1"},
{"{#SCHTASKNAME}": "TaskName2"}
]
}
如何实现?
上面简单的介绍了下自动发现的原理,后面就好办了。因为Zabbix没有自带的计划任务接口,所以得我们自己编写脚本。
实现步骤分为三步:
- 通过脚本获取符合条件的计划任务列表;
- 通过脚本查询指定计划任务的状态和上次运行结果;
- 根据返回的结果,设置合适的触发器进行告警;
具体实施
各位看官,我本来计划用一篇文章全部说完的,但是没想到,Windows的各种问题导致我用了几种方法才解决。
具体方法如下:
- batch通过schtasks.exe进行计划任务进行采集;
- powershell通过cmdlet进行计划任务信息采集;
- powershell通过COM对象进行计划任务信息采集;
第3条路再不通的话,我计划试试vbs或者直接DotNet写程序了。
因为问题解决了,所以就不再絮絮叨叨了。
参考
其实参考内容挺多的,主要是各种疑难杂症的处理。
- Get-ScheduledTask
- Get-ScheduledTaskInfo
- 批处理命令中的chcp 命令字符集与别名汇总
- Status of Scheduled Task
- 批处理中如何判断传进来的参数是否为空
- Zabbix监控(八):自动监控windows端口
- DOS批处理命令-字符串操作
- Dos批处理命令拼接字符串的问题
- How can I retrieve the status of a scheduled task using schtasks?
- Schtasks 计划任务参数 详解
- 常用批处理命令总结3之Find和FindStr
- schtasks错误: 无法加载列资源。
- 困扰了我数个昼夜的Windows 7 “幽灵现象”【仍未解决,待高人指点】
- Get scheduled tasks from remote computer