crontab用于定时执行任务。
1、在命令窗中输入:
crontab -e
如果是第一次打开,会让你选择使用的文本编辑器。我选vim(以后可以使用select -editor更改)
打开后,最后看到的是
m h dom mon dow command
简单写一个定时任务:每隔5分钟,输出当前时间到文件time.log中
*/5 * * * * date >> /home/xyw/time.log
保存文件后,需要重启cron服务才能生效。
sudo service cron restart
下面解释一下crontab每行的含义:
crontab中的每一行代表一个定期执行的任务,分为6个部分。前5个部分表示何时执行命令,最后一个部分表示执行的命令。每个部分以空格分隔,除了最后一个部分(命令)可以在内部使用空格之外,其他部分都不能使用空格。前5个部分分别代表:分钟,小时,天,月,星期,每个部分的取值范围如下:
分钟 0 - 59
小时 0 - 23
天 1 - 31
月 1 - 12
星期 0 - 6 0表示星期天
除了这些固定值外,还可以配合星号(*),逗号(,),和斜线(/)来表示一些其他的含义:
星号 表示任意值,比如在小时部分填写 * 代表任意小时(每小时)
逗号 可以允许在一个部分中填写多个值,比如在分钟部分填写 1,3 表示一分钟或三分钟
斜线 一般配合 * 使用,代表每隔多长时间,比如在小时部分填写 */2 代表每隔两分钟。所以 */1 和 * 没有区别
注:*/2 可以看成是能被2整除的任意值。
实例:
* * * * * # 每隔一分钟执行一次任务
0 * * * * # 每小时的0点执行一次任务,比如6:00,10:00
6,10 * 2 * * # 每个月2号,每小时的6分和10分执行一次任务
*/3,*/5 * * * * # 每隔3分钟或5分钟执行一次任务,比如10:03,10:05,10:06
因为cron中的任务基本就是执行命令行,所以当然也会有权限问题。以上例子中的任务就是以你当前登录用户的权限执行的,如果你需要以root用户执行某个任务,可以在crontab前加上sudo。
sudo crontab -e
crontab文件对每个用户都是不同的,所以刚才设置的定期看时间的任务,在这里是看不到的。因为我们没有为root用户增加这样的计划任务。
我们一般使用crontab执行脚本命令,下面介绍一下脚本命令在crontab中的使用方法。
以sh脚本执行Java程序中制作的脚本为例。
#!/bin/bash
cd /home/xyw/
/usr/lib/jvm/jdk1.7.0_21/bin/java Hello
假设这个脚本命名为hello.sh 并且存放在/home/xyw/目录下,我想每30分钟执行这个脚本,并且想把结果保存到文件Log.log 中,写法如下:
*/30 * * * * bin/sh /home/xyw/hello.sh >> /home/xyw/Log.log
如果我想一次执行多个任务呢?假如我还想将执行时间保存到Log.log 文件中,写法如下:
*/30 * * * * date >> /home/xyw/Log.log; bin/sh /home/xyw/hello.sh >> /home/xyw/Log.log
两个任务之间用分号间隔。关于一条crontab执行多个任务的方法,具体说明如下:
方法一:
*/30 * * * * bin/sh /home/xyw/task1.sh
*/30 * * * * bin/sh /home/xyw/task2.sh
方法二:
*/30 * * * * bin/sh /home/xyw/task1.sh; bin/sh /home/xyw/task2.sh
方法三:
*/30 * * * * bin/sh /home/xyw/task1.sh && bin/sh /home/xyw/task2.sh
方法四:
*/30 * * * * bin/sh /home/xyw/task1.sh || bin/sh /home/xyw/task2.sh
注意,以上方法中方法一和方法二等同。多个命令放在一行,他们的执行情况需要根据中间的分隔符确定。
(1)每个命令被分号分隔,那么命令会连续依次执行下去。
(2)每个命令被&&分隔,命令会按照出现的顺序依次执行,如果在执行命令的过程中出现错误,即中间有错误的命令存在,则以后的命令不会被执行。(相当于与运算,全部命令都没有错误时,才全部执行完成。)
(3)每个命令被||分隔,如果命令遇到可以成功执行的命令,那么命令停止执行,即使后面还有正确的命令则后面的所有命令都将得不到执行。假如命令一开始就执行失败,那么就会执行 || 后的下一个命令,直到遇到有可以成功执行的命令为止,假如所有的都失败,则所有这些失败的命令都会被尝试执行一次。