我正在沿着Prometheus测试Pushgateway,每分钟通过crontab触发的bash脚本和curl推送有关我的VM服务的简单数据。
我有两个bash脚本。
第一个cpu_usage.sh
解析并通过curl将关于ps -aux
命令的数据发送到pushgateway:
#!/usr/bin/env bash
z=$(ps aux)
while read -r z
do
var=$var$(awk '{print "cpu_usage{process=\""$11"\", pid=\""$2"\", cpu=\""$3"\"}", $3z}');
done <<< "$z"
curl -X POST -H "Content-Type: text/plain" --data "$var
" http://localhost:9091/metrics/job/top/instance/machine
一切正常,我的crontab每分钟将格式化的数据发送到我的pushgateway实例localhost:9091
。
现在,我正尝试使用名为service --status-all
的脚本发送services_list.sh
命令的解析结果,这正是我处理cpu_usage.sh
脚本的方式:< / p>
#!/usr/bin/env bash
y=$(service --status-all)
while read -r y
do
varx=$varx$(awk '{print "services_list{service=\""$y"\"}", 1}');
done <<< "$y"
curl -X POST -H "Content-Type: text/plain" --data "$varx
" http://localhost:9091/metrics/job/top/instance/machine
在手动执行两个脚本(例如./cpu_usage.sh
和./services_list.sh
)时,一切正常,Pushgateway可以从两个脚本中成功检索数据。
但是当我通过CRON传递这些调用时,只有cpu_usage.sh
会将数据发送到Pushgateway(Pushgateway上对services_list
方法的最后一次推送的时间戳保持不变)。
我的crontab语法类似于:* * * * * cd /path/ && ./script.sh
脚本位于777
/ root:root
中,crontab始终以root用户身份进行编辑。我已经尝试将两个scipt连接到一个bash文件中,无论我将它们放置的顺序如何,都不会进行services_list
方法的curl调用(但是cpu_usage
方法的一切正常)。>
我有点迷茫,因为这两个脚本非常相似,并且在services_list.sh
上进行手动调用可以正常工作。有什么想法吗 ?谢谢。
在Debian 9上使用Pushgateway 0.10运行。
答案 0 :(得分:0)
无法从crontab调用命令service
。从cron调用service
资源时,我必须提供/usr/sbin/service --options
资源的完整路径。
在这种情况下,我的y=$(/usr/sbin/service --status-all)
脚本中的y=$(service --status-all)
代替了services_list.sh
,一切运行正常。