今天有个定时任务要从windows上部署到linux上,查了好多资料,总是有各种各样的问题。虽然最后终于都一一解决了,不过感觉现有的那些详细教程什么的不够详细,或者说大神们想当然的事,像我这种小白就还是会跳坑。然后就把网上现有的许多的crontab的文章总结了一下,加上自己的经历和体会,分享给大家。
首先基本介绍了一下crontab,然后说一些具体的列子,最后则是一些常用的命令和总结我遇到的一些问题。好了,待我一一说来吧。
首先,Linux下定时任务是有个进程的,crond,他的配置文件是/etc/cron*文件下。用户如果想使用crontab任务(即定时任务),可以用
crontab -e (进入定时任务编辑界面,默认为VI编辑器,编辑器可配置。在此顺带说两句VI编辑器的使用,简单来说,进入编辑,可以用以下两个命令直接编辑
A:当前行的尾部追加内容 i:游标前插入内容 l:游标后插入内容)
如果你之前没有过定时任务的话,那么crontab -e进去之后直接就是空白。然后就进行添加就行了,添加格式如下:
基本格式 :
* * * * * command
分 时 日 月 周 命令
第一个星号所在的列表示分钟,范围为1~59,*表示范围内的所有值,即全选,*/1 表示每一分钟,同样,*/5表示整点开始,每5分钟。
第二个星号所在的列表示小时,范围1~23(0表示0点)。同样适用于*/1 表示每小时。
第三个星号所在的列表示日期,范围1~31。
第四个星号所在的列表示月份,范围1~12.
第五个星号所在的列表示周,范围0~6 (0表示周日)。
第六个星号所在的列表示命令,即你想要执行的命令。
(额外说一下VI的保存命令,在填写完成你要定时执行的任务后,用:wq或者:x保存退出,:wq表示强制保存退出,:x表示有更改时才会保存退出,没有直接退出,二者设计版本号的更新问题,在此不细说。)
下面具体给出几个crontab运用时间的例子
*/1 * * * * /home/manager/ps.sh
表示每一分钟执行一次,在路径/home/manager/下的ps.sh文件
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
表示每月1、10、22日的4 : 45重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
因为我是要用linux的定时任务定时执行.jar文件,所以就以此详细说一下。
首先我的crontab命令很简单 13 * * * * /home/RealDataPublish.sh 即每小时的13分钟执行以下RealDataPublish.sh这个文件。
然后就是在RealDataPublish.sh文件中的编写了,大家都知道,在JAVA环境中,运行jar文件直接java -jar +文件名就可以了,然后我的
RealDataPublish.sh文件一开始就是这么写的。。。然后错误提示 java:无法获取的命令。(关于错误提示在哪下面会说。)
然后就是RealDataPublish.sh中的内容了,把我的写法贴出来大家参考一下吧。
cd /usr/local/ (获取.jar文件的路径)
/usr/java/jdk1.6.0_13/bin/java -jar RealDataPublish.jar -cp /usr/java/jdk1.6.0_13/lib/tools.jar:/usr/java/jdk1.6.0_13/lib/dt.jar: (需要在java前加上
JDK安装路径,最后 -cp 获取配置信息)
就可以完成在linux中用定时器运行jar文件的任务了。
最后说一下,定时器执行一次任务,每次都会有回执邮件,在/var/spool/mail/root 下 (如果你是root用户登录的话)
常用的命令:
crontab -l 查看所有正在运行的所有crontab命令
crontab -r : 删除目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab
ps –ef|grep crond 查看crontab是否已经启动
如果没有启动则运行service crond start 即可启动。(如果提示Redirecting to /bin/systemctl start crond.service,则是因为版本的问题导致,可以使
用/bin/systemctl start crond.service进行启动)
如果是关于crontab不能执行的问题,初步总结了有以下几个原因:
第一,脚本的原因:大多数情况下,就是我们的脚本的问题,这种问题导致crontab不能执行的概率占到 70%以上。因为程序执行到某一步导致crontab终止执行。
第二,执行环境问题,当我们碰到第一情况下,一般都可以通过手动执行程序将问题扼杀在摇篮里,一般情况下高手是不应该犯第一种错误的。问题是当我们 手动执行成功而crontab不能执行的时候,就是执行环境的问题,例如相关路径的设置问题。解决方案:在代码最前面执行 source /home/user/.bash_profile
第三,系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:date -s ********
第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。
第五,crontab 守护进程死掉了。这种情况是极少发生的,但也不排除,当我们实在是找不到其他原因的时候可以用。解决方案:重启该进程。
写到这才发现,我之前遇到的坑,在我介绍的时候就已经避过了...尴尬! 那错误的地方我就不一一说明了。如果有任何其他的问题都可以去查看回执
邮件的内容,以报错信息来排错,就简单的多了。
最后,祝大家编码顺利!