一、cron
1、简介
Cron is a system daemon used to execute desired tasks (in the background) at designated times.
Cron是一个系统守护进程,用于在指定的时间(在后台)执行所需的任务。
A crontab file is a simple text file containing a list of commands meant to be run at specified times.
crontab文件是一个简单的文本文件,其中包含一系列要在指定时间运行的命令。
2、格式
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段。格式如下:
field | allowed values |
---|---|
minute | 0-59 |
hour | 0-23 |
day of month | 1-31 |
month | 1-12 (or names, see below) |
day of week | 0-7 (0 or 7 is Sun, or use names) |
command:要执行的命令,可以是系统命令,也可以是自己编写的shell脚本文件。 在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,全部。
逗号(,):可以用逗号隔开的值指定一个列表范围。
中杠(-):可以用整数之间的中杠表示一个整数范围。
正斜线(/):一般配合 * 使用,代表每隔多长时间。(比如分钟部分填写 */3 代表每隔3分钟)
3、编辑
The -e option is used to edit the current crontab using the editor specified by the EDITOR environment variable.
crontab -e
使用以上命令,可以打开你的用户所属的crontab文件。
注意:第一次用这个命令,会让你选择文本编辑器,默认的是nano。选定的编辑器也可以使用命令
select-editor
进行修改。
或者,export EDITOR=vim
。
打开后的crontab文件类似这样子:
# m h dom mon dow command
20 14 22 2 5 touch /var/www/c_test03.txt #创建一个文件的例子
注意:After you exit from the editor, the modified crontab is checked for errors and, if there are no errors, it is installed automatically. The file is stored in /var/spool/cron/crontabs but should only be edited using the crontab command.
crontab文件对每个用户都是不同的。cron中的任务是以你当前登录用户的权限执行的,如果你需要以root用户执行某个任务,可以在crontab前加上sudo。
sudo crontab -e
4、其它命令
crontab [ -u user ] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
1)-u user
用来设定某个用户的crontab服务,例如,“-u nosee”表示设定nosee用户的crontab服务,此参数一般有root用户来运行。
2)file
file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
3)-l
The -l option causes the current crontab to be displayed on standard output.
显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
crontab -l
4)-r
The -r option causes the current crontab to be removed.
从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
crontab -r
5)-i
The -i option modifies the -r option to prompt the user for a 'y/Y' response before actually removing the crontab.
在删除用户的crontab文件时给确认提示。
5、cron服务
/etc/init.d/cron {start|stop|status|restart|reload|force-reload}
或:
service cron {start|stop|status|restart|reload|force-reload}
6、cron相关文件
1)cron.allow与cron.deny
If the /etc/cron.allow file exists, then users must be listed in it in order to be allowed to run the crontab command. If the /etc/cron.allow file does not exist but the /etc/cron.deny file does, then users must not be listed in the /etc/cron.deny file in order to run crontab.
cron.allow文件中所列用户允许使用crontab命令,cron.deny文件中所列用户不允许使用crontab命令。
In the case where neither file exists, the default on current Ubuntu (and Debian, but not some other Linux and UNIX systems) is to allow all users to run jobs with crontab.
No cron.allow or cron.deny files exist in a standard Ubuntu install, so all users should have cron available by default, until one of those files is created. If a blank cron.deny file has been created, that will change to the standard behavior users of other operating systems might expect: cron only available to root or users in cron.allow.
在标准Ubuntu中默认不存在cron.allow或cron.deny文件,因此默认情况下所有用户都应该有cron可用。
2)/var/spool/cron/
所有用户crontab文件存放的目录,以用户名命名。
3)/etc/crontab
这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
7、注意事项
- 环境变量
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
- 其它
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
8、创建cron脚本
第一步:写cron脚本文件,命名为crontest.cron。
15,30,45,59 * * * * echo "xgmtest....." >> xgmtest.txt 表示,每隔15分钟,执行打印一次命令
第二步:添加定时任务。执行命令 “crontab crontest.cron”。搞定
第三步:"crontab -l" 查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本
注意:这操作是直接替换该用户下的crontab,而不是新增。
二、at
at 只能执行一次,在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程。
at是英语 "在...时刻" 的意思。
1、语法
at [-V] [-q queue] [-f file] [-mMlv] timespec...
at [-V] [-q queue] [-f file] [-mMkv] [-t time]
at -c job [job...]
atq [-V] [-q queue]
at [-rd] job [job...]
atrm [-V] job [job...]
batch
at -b
2、at服务
/etc/init.d/atd {start|stop|restart|force-reload|status}
或:
service atd {start|stop|status|restart|reload|force-reload}
查看at进程:
root@Chan:~# ps -ef|grep atd
daemon 622 1 0 2018 ? 00:00:00 /usr/sbin/atd -f
root 2986 2693 0 18:22 pts/5 00:00:00 grep --color=auto atd
3、用法
1)在指定时刻执行程序
先用at命令后接想要程序执行的确定时刻;
再输入你想要在以上指定时刻执行的命令。
如:
root@Chan:/var/www# at 0:55
warning: commands will be executed using /bin/sh
at> touch a_test.txt
at> <EOT>
job 2 at Tue Mar 5 00:55:00 2019
说明:
- 输入命令结束时可以按Ctrl + D组合键,这时at会显示<EOT>。
- 如果是想在明天执行指定任务则可以在时间后面加上tomorrow,如:
at 0:55 tomorrow
。 - 如果想指定具体日期,则如:
at 17:12 4/5/19
,依次是月/日/年
。
2)在指定间隔之后执行程序
例如,在10分钟之后执行指定程序:
root@Chan:/var/www# at now +2 minutes
warning: commands will be executed using /bin/sh
at> touch a_test2.txt
at> <EOT>
job 3 at Tue Mar 5 01:03:00 2019
还可以使用其它的关键字,如:
minutes、hours、days、weeks、months、years
例如:at now +7 weeks
表示在距今7个星期之后执行。
4、atq和atrm
每次我们用at命令指定延时执行的命令,at都会为其分配一个job编号,比如我们上面的两个例子,分别被分配了2和3的编号。2号是touch a_test.txt
,3号是touch a_test2.txt
。
atq命令可以列出正等待执行的at任务。q是英语queue的首字母,queue表示“队列”,会列出at命令的任务队列。
atrm命令可以删除正在等待执行的at任务。rm是英语remove的首字母,remove表示“删除”。后接at任务的编号。例如1和2这样的编号。
三、经典案例
1、如何实现每天0点钟重新启动服务器。
0 0 * * * reboot
参考
1、查看命令:man 5 crontab
、man at
。
2、Ubuntu官方文档:https://help.ubuntu.com/community/CronHowto
3、https://www.jianshu.com/p/e62de8adb6e0
网友评论