在 Pushgateway (Prometheus) 上使用 Curl 对 Cron 进行故障排除

Troubleshooting Cron with Curl on Pushgateway (Prometheus)

我正在沿着 Prometheus 测试 Pushgateway,使用 bash 脚本和 crontab 触发的 curl 每分钟推送有关我的 VM 服务的简单数据。

我有两个 bash 脚本。 第一个,cpu_usage.sh,解析有关 ps -aux 命令的数据并将其发送到 pushgateway,通过 curl :

#!/usr/bin/env bash

z=$(ps aux)
while read -r z
do
   var=$var$(awk '{print "cpu_usage{process=\"""\", pid=\"""\", cpu=\"""\"}", z}');
done <<< "$z"

curl -X POST -H  "Content-Type: text/plain" --data "$var
" http://localhost:9091/metrics/job/top/instance/machine

这台一切正常,我的 crontab 每分钟都会将格式化数据发送到 localhost:9091,我的 pushgateway 实例。

现在,我正在尝试使用名为 services_list.sh 的脚本发送 service --status-all 命令的解析结果,这与我处理 cpu_usage.sh 脚本的方式完全相同:

#!/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 身份编辑。我试图将两个 scipts 连接在一个 bash 文件中,无论我放置它们的顺序如何,都不会对 services_list 方法进行 curl 调用(但是 cpu_usage 方法一切正常).

我有点迷茫,因为这两个脚本非常相似,而且 services_list.sh 上的手动调用工作正常。有什么想法吗 ?谢谢。

运行 在带有 Pushgateway 0.10 的 Debian 9 上。

Fixed :

无法从 crontab 调用命令 service。从 cron 调用时,我必须提供 service 资源的完整路径,例如 /usr/sbin/service --options.

在这种情况下,在我的 services_list.sh 脚本中用 y=$(/usr/sbin/service --status-all) 代替 y=$(service --status-all) 一切都 运行 没问题。