【linux】记录一次crontab定时任务+ lsof 无法正常执行的问题
前言
书接上文:
https://blog.csdn.net/Mrerlou/article/details/120306748
最近要实现使用脚本统计 Presto
进程打开的文件描述符并向open-falcon
推送数据。
但是在实现中,遇到了问题。记录并整理一下。
准备
编写采集数据脚本
具体的流程是:
- 找到
presto
服务的PID
- 使用
lsof
查看presto
服务打开的文件数 - 统计数据然后推送到
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上。
添加定时任务:
- 编辑
crontab
crontab -e
- 编辑内容如下
# 采集presto服务打开的文件描述符
*/1 * * * * cd /home/rong/opbin && ./presto_file_descriptor.sh
本以为添加个定时任务,就大功告成了。
没想到居然是痛苦的开始。
继续观察open-falcon
的监控数据,没想到定时任务是成功执行了,但是采集的数据却是不正常的。
可以看到是有定时的在采集数据,但是采集的数据都是0,嗯?
后面我又尝试手动执行脚本推送数据。
可以明显看到,手动执行脚本数据就正常,定时任务执行脚本数据就不正常。
那么问题大概是出在了定时任务身上,网上也有定时任务执行失败的情况如:
- 脚本权限不够,这个不符合我的情况
- shell脚本执行器,如
bash
,sh
,也不是我的情况 - 其余什么路径不对,脚本计划任务的时间设置等更是对不上。
那么真正的原因是什么?
此时在翻回头查看我的脚本,总共就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
将错误日志重定向到正常日志中,这样你就可以查看错误的日志内容,对于你解决问题很有帮助。