crontab定时执行shell脚本失败的缘由

有一段时间不用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文件的增加状况,这样就避免了使用绝对路径的问题。

相关文章
相关标签/搜索