【linux】记录一次crontab定时任务+ lsof 无法正常执行的问题

前言

书接上文:
https://blog.csdn.net/Mrerlou/article/details/120306748

最近要实现使用脚本统计 Presto进程打开的文件描述符并向open-falcon推送数据。

但是在实现中,遇到了问题。记录并整理一下。

准备

编写采集数据脚本

具体的流程是:

  1. 找到presto服务的PID
  2. 使用lsof 查看presto服务打开的文件数
  3. 统计数据然后推送到open-falcon

脚本详情如下:

#!/bin/bash

# 采集presto 服务打开的文件描述符推送到falcon中

pid=`ps -ef|grep -i presto-server |grep -v grep | awk '{print $2}'`
fd=`lsof -n|grep ${pid} |wc -l`

echo $fd
./pushFalcon -h $(hostname) -m 'presto.file_descriptor' -s 60 -v $fd

然后开始手动执行。

sh presto_file_descriptor.sh

手动推送了几条数据,看了下open-falcon,数据成功推送到了open-falcon上。
在这里插入图片描述

添加定时任务:

  1. 编辑crontab
crontab -e
  1. 编辑内容如下
# 采集presto服务打开的文件描述符
*/1 * * * * cd /home/rong/opbin && ./presto_file_descriptor.sh

本以为添加个定时任务,就大功告成了。

没想到居然是痛苦的开始。

继续观察open-falcon的监控数据,没想到定时任务是成功执行了,但是采集的数据却是不正常的。

在这里插入图片描述

可以看到是有定时的在采集数据,但是采集的数据都是0,嗯?

后面我又尝试手动执行脚本推送数据。

在这里插入图片描述

可以明显看到,手动执行脚本数据就正常,定时任务执行脚本数据就不正常。

那么问题大概是出在了定时任务身上,网上也有定时任务执行失败的情况如:

  1. 脚本权限不够,这个不符合我的情况
  2. shell脚本执行器,如bashsh,也不是我的情况
  3. 其余什么路径不对,脚本计划任务的时间设置等更是对不上。

那么真正的原因是什么?

此时在翻回头查看我的脚本,总共就3句话

对于第一句,比较简单,应该可以排出。

对于第三句,

./pushFalcon -h $(hostname) -m 'presto.file_descriptor' -s 60 -v $fd

这个尝试修改下:

./pushFalcon -h $(hostname) -m 'presto.file_descriptor' -s 60 -v 1234

将发送的值改为定值,重新试一下。

于是就出现了下图一幕。
在这里插入图片描述

定时任务能够成功推送我编写的定值到open-falcon上。

那么问题应该很明显了,总共三句话的脚本,第一句凭借经验可以排除,第三句通过推送定值来排出,那么只会是第二句出问题了。

fd=`lsof -n|grep ${pid} |wc -l`

没办法,只能百度下lsof命令了。

于是刷到了这么一篇文章

  • http://blog.sina.com.cn/s/blog_8c5d89000102voov.html
  • https://www.cnblogs.com/ministep/p/14776223.html

原来 :crontab 调度使用的路径 和 普通账户使用的路径不一样,使用绝对路径即可。

修改脚本如下:

#!/bin/bash

# 采集presto 服务打开的文件描述符推送到falcon中

pid=`ps -ef|grep -i presto-server |grep -v grep | awk '{print $2}'`
fd=`/usr/sbin/lsof -n|grep ${pid} |wc -l`

echo $fd
./pushFalcon -h $(hostname) -m 'presto.file_descriptor' -s 60 -v $fd

观察open-falcon
在这里插入图片描述
数据成功采集到,问题解决!

后序

解决这个问题多少有点取巧的成分在里面,因为这个shell脚本比较简单,总共就3句话,排查起来也简单,但是真正暴露的是对crontab 调度的执行原理不清楚导致。

这次的推数风波,还是比较折磨人的,但最终还是成功解决,整理并记录下来!

注意: 如果排查定时任务无法执行的原因,特别强调一定要去打印日志,并且一定要去打印错误的日志, 很多人都只是简单的输出下日志 如 >> log.txt 中,这样输出的日志只有正确内容,是看不到错误日志,所以对于问题排查没有任何帮助,只需在后面添加一个 2>&1 将错误日志重定向到正常日志中,这样你就可以查看错误的日志内容,对于你解决问题很有帮助。

posted @ 2022-11-10 19:25  彬在俊  阅读(90)  评论(0编辑  收藏  举报