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