Linux 中使用 crontab 来定时执行命令或指定脚本。
Hello World
先什么都不要说,跟我一起 Hello World
首先修改 ~/.bash_profile
1 | export EDITOR=vim |
然后执行 source ~/.bash_profile
使配置生效
随后新建一个定时任务
1 | $ crontab -e |
将下面的文字复制进去
1 | * * * * * /bin/echo Hello World `date`\n >> ~/output |
1 | crontab: installing new crontab |
这代表你已经创建一个定时任务,它的作用是,每分钟在 ~/output
文件中添加一行带有时间标记的字符串 Hello World
,如下
1 | Hello World Sun Jan 14 20:14:01 CST 2018n |
你使用 tail -f ~/output
命令就可以每隔一分钟看到一行输出。
使用说明
不管你有没有成功的实现刚才的效果,现在来跟我一起看看刚才就做了些什么吧
- crontab -e crontab 执行定时任务,需要配置任务列表,这条命令就是在编辑任务
- export DEITOR=vim 是为了指定编辑任务时,使用的编辑器,现在绝大多数 Linux 都是用 Vim
编辑生成的任务文件在目录/var/spoot/cron
中(这是 CentOS 系统,如果是 Ubuntu 则是在/var/spoot/cron/crontabs
目录中)有一个用户名命名的文件,比如root
,剩下的操作刚才已经有所介绍,还有一些常用命令查看任务列表
1
$ crontab -l
1 | * * * * * /bin/echo Hello World `date`\n >> ~/output |
删除任务
1 | $ crontab -r |
这样刚才生成的文件就会被删除掉
第二种方法
如果你不像文件生成在这个目录中,也可以做如下操作1
2
3
4
5$ vim ~/roottab # 手动生成一个配置文件
* * * * * /bin/echo Hello World `date`\n >> ~/output
$ crontab ~/roottab # 启动定时任务,并制定该文件
配置文件格式
下面来详细说说 crontab 文件格式1
2
3
4
5
6
7* * * * * /bin/echo Hello World `date`\n >> ~/output
|-|-|-|-|-|- 分钟 0 ~ 59
|-|-|-|-|- 小时 0 ~ 23
|-|-|-|- 日 1 ~ 31
|-|-|- 月 1 ~ 12
|-|- 周 0 ~ 7
|- 需要执行的命令
更多使用实例
1 | # 每分钟执行一次 |
按秒数间隔来执行
有点需要单说一下,crontab 最小单位是按照分钟来执行的,默认是不支持按照秒数来执行的,不过我们可以想一些变通的方法,利用延时。
1 | * * * * * sleep 15; /bin/echo Hello World `date`\n >> ~/output |
上面的语句代表了每分钟执行任务的时候,先睡眠 15 秒在执行。
1 | * * * * * /bin/echo Hello World `date`\n >> ~/output |
这样写的话就代表了,每分钟执行一次,每分钟推后 15 秒在执行一次,在多写几个,我们就可以得到一个每隔 15 秒执行一次的定时任务了,比如
1 | * * * * * /bin/echo Hello World `date`\n >> ~/output |
唯一的缺点就是第一次执行这个定时任务的时候,前 1 分钟是轮空的。
服务状态
Ubuntu1
2# 启动、重启,停止、重载、运行状态
$ service cron start|restart|stop|reload|status
CentOS < 71
2
3
4
5
6# 启动、重启,停止、重载、运行状态
$ service crond start|restart|stop|reload|status
$ chkconfig sshd on # 开机自启sshd
$ chkconfig sshd off # 开机关闭自启sshd
$ chkconfig --list sshd # 查看每个运行级别类型中服务的当前状态
CentOS >= 71
2
3
4
5
6
7$ systemctl enable crond.service # 开机自启crond
$ systemctl disable crond.service # 开机关闭自启crond
$ systemctl start crond.service # 启动crond
$ systemctl restart crond.service # 重启
$ systemctl stop crond.service # 停止
$ systemctl reload crond.service # 重新加载
$ systemctl status crond.service # 查看启动状态