有一段时间不用crontab定时执行任务了,这次趁着项目实施的机会来进一步分析一下crontab定时任务设置时遇到的一些棘手的问题。
crontab -l 查看目前已经设置的crontab信息
crontab -e 编辑定时任务
举例说明
*/1 * * * * jstack 进程号 >> jstack.log
前五个“*”号分别代表“分钟(0-59) 小时(0-23) 天(1-31) 月(1-12) 星期(0-6, 0表示星期日)
上面例子中表示的每隔一分钟就执行一次jstack并将运行结果输出到jstack.log中。
有小伙伴可能会说,这样执行可能会不成功哦,那么问题来了,为什么会不成功?
如果当前你用的是root用户,而且环境变量中如果配置好了java环境变量,那么执行上面的crontab是没问题的,但是如果你用的其他新建的用户,虽然你可能也配置了java环境变量
但是crontab不会读取你其他用户环境变量中的内容,所以解决方案是把执行命令保存成一个shell脚本,在脚本中显示执行当前用户的环境变量,再运行命令输出
#!/bin/bash
. /etc/profile
. ~/.bash_profile
echo 获取java进程号
pid=`ps -ef|grep java|awk '{print $2}'`
echo ${pid}
echo 开始记录jstack信息,并输出到根目录的jstack.log
jstack ${pid} >> jstack.log
假设上面这段代码保存到jstack.sh文件,这样再设置crontab的时候直接
*/1 * * * * /home/test/jstack.sh
这样就可以啦,观察jstack.log文件的增长情况,这样就避免了使用绝对路径的问题。