Linux 中计划任务和周期任务
0X00 Linux中的计划任务
我们使用Linux更多的时候是在服务器上,然而我们有的时候就需要让计算机在固定的某个时间做一些事情。比如我们就可能有有如下需求:
- 临时有事需要离开电脑,但是一个小时后需要备份某个目录里的文件
- 写了个爬虫去抓取某网站的新闻,每隔十分钟就去爬取一次
- 周期性的执行某脚本,但放在后台的话退出ssh就会被自动关掉
- 其实还有好多这种可能…
在Linux中有两种常见的任务管理,一个是at也就是在某时做某事,另一个是crontab也就是周期性任务表。使用at可以方便地给Linux设置一个在什么时候做什么事的计划,用crontab可以方便地给Linux设置我要做某事,多久做一次。
0X01 使用at命令
检查atd服务是否开启
atd就是at命令的守护进程,系统默认是打开着的,但是也有可能被关掉,在RHEL系中可以使用systemctl status atd来查看服务是否已经开启,没有开启的话可以用systemctl restart atd来打开服务
创建一个计划任务
先创建一个在今天的21:09的任务,任务内容是输出hello,world重定向到/hello文件。然后到时间之后再检查这个文件是否出现了。当我们只指定时分的时候,默认是当天,如果已经过了的时间的话,会默认为次日。
1# 一个即日的计划任务
2[root@iZ28jaak5nnZ ~]# date
3Wed Nov 2 21:07:07 CST 2016
4[root@iZ28jaak5nnZ ~]# at 21:09
5at> echo "hello,world" > /hello
6at> <EOT>
7job 5 at Wed Nov 2 21:09:00 2016
8[root@iZ28jaak5nnZ ~]# date
9Wed Nov 2 21:09:10 CST 2016
10[root@iZ28jaak5nnZ ~]# cat /hello
11hello,world当我们输入at 21:09之后,就进入了at模式,我们在这里输入的命令就是之后将要执行的命令。当输入完命令之后按Ctrl + D就可以退出at模式,此时计划任务创建完毕,系统会提示你计划任务的执行时间。
下面还有几个例子
1# 一个准确定时的计划任务
2[root@iZ28jaak5nnZ ~]# at 00:00 2016-11-11 # 在2016光棍节零点输出一个'hey 单身狗'
3at> echo "hey single dog"
4at> <EOT>
5job 7 at Fri Nov 11 00:00:00 2016
6
7# 在十分钟后执行
8[root@iZ28jaak5nnZ ~]# at now+10min
9at> echo 'hello single dog'
10at> <EOT>
11job 9 at Wed Nov 2 21:26:00 2016
12
13
14# 在一小时后执行
15[root@iZ28jaak5nnZ ~]# at now+1hour
16at> echo 'hey single dog'
17at> <EOT>
18job 10 at Wed Nov 2 22:16:00 2016查看已有的at
可以使用atq命令来查看存在的at计划任务,注意这里并不一定全都是用户自己创建的,也有的是系统创建的。通过atq查看到之后可以使用at -c 来查看某个计划任务的具体信息。
1[root@iZ28jaak5nnZ ~]# at now+1hour
2at> echo "hello"
3at> <EOT>
4job 11 at Wed Nov 2 22:23:00 2016
5[root@iZ28jaak5nnZ ~]# atq
6# 这里输出的第一列就是at的编号,下面查看详细信息就是根据编号查看的
77 Fri Nov 11 00:00:00 2016 a root
86 Thu Nov 3 03:00:00 2016 a root
910 Wed Nov 2 22:16:00 2016 a root
109 Wed Nov 2 21:26:00 2016 a root
1111 Wed Nov 2 22:23:00 2016 a root
121 Wed Nov 2 21:52:00 2016 a root
13[root@iZ28jaak5nnZ ~]# at -c 11
14#!/bin/sh
15# atrun uid=0 gid=0
16# mail root 0
17umask 22
18XDG_SESSION_ID=669; export XDG_SESSION_ID
19............................... # 这里省略了好多环境变量,重点在下面
20XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
21cd /root || {
22 echo 'Execution directory inaccessible' >&2
23 exit 1
24}
25${SHELL:-/bin/sh} << 'marcinDELIMITER0e9efce8' # 这里是执行的命令
26echo "hello"
27
28marcinDELIMITER0e9efce8删除一个at
使用一个atrm命令可以指定at号删除特定的at计划任务。
1[root@iZ28jaak5nnZ ~]# at now+1hour
2at> echo 'hello'
3at> <EOT>
4job 12 at Wed Nov 2 22:27:00 2016
5[root@iZ28jaak5nnZ ~]# atq
67 Fri Nov 11 00:00:00 2016 a root
76 Thu Nov 3 03:00:00 2016 a root
810 Wed Nov 2 22:16:00 2016 a root
911 Wed Nov 2 22:23:00 2016 a root
1012 Wed Nov 2 22:27:00 2016 a root
111 Wed Nov 2 21:52:00 2016 a root
12[root@iZ28jaak5nnZ ~]# atm 12
13-bash: atm: command not found
14[root@iZ28jaak5nnZ ~]# atrm 12
15[root@iZ28jaak5nnZ ~]# atq
167 Fri Nov 11 00:00:00 2016 a root
176 Thu Nov 3 03:00:00 2016 a root
1810 Wed Nov 2 22:16:00 2016 a root
1911 Wed Nov 2 22:23:00 2016 a root
201 Wed Nov 2 21:52:00 2016 a root
21
22
23[root@iZ28jaak5nnZ ~]# at now+1hour
24at> echo 'hello'
25at> <EOT>
26job 12 at Wed Nov 2 22:27:00 2016
27[root@iZ28jaak5nnZ ~]# atq
287 Fri Nov 11 00:00:00 2016 a root
296 Thu Nov 3 03:00:00 2016 a root
3010 Wed Nov 2 22:16:00 2016 a root
3111 Wed Nov 2 22:23:00 2016 a root
3212 Wed Nov 2 22:27:00 2016 a root
331 Wed Nov 2 21:52:00 2016 a root
34[root@iZ28jaak5nnZ ~]# atrm 12
35[root@iZ28jaak5nnZ ~]# atq
367 Fri Nov 11 00:00:00 2016 a root
376 Thu Nov 3 03:00:00 2016 a root
3810 Wed Nov 2 22:16:00 2016 a root
3911 Wed Nov 2 22:23:00 2016 a root
401 Wed Nov 2 21:52:00 2016 a root0X02 使用crontab命令
- 这里的配置分成六段
分---时---日---月---周---命令
创建周期任务
使用任何一个用户登陆到系统之后,就可以执行crontab -e就进入了vi的编辑器模式,然后我们来编辑这个文件就可以创建/修改周期任务了。
115 10 1 10 * echo 'hello' > /tmp/hello # 在每个10月1号10点15分执行命令
215 10 1 * * echo 'hello' > /tmp/hello # 在每个1号10点15分执行命令
315 10 * * * echo 'hello' > /tmp/hello # 在每个10点15分执行命令
415 * * * * echo 'hello' > /tmp/hello # 在每个15分执行命令
5*/3 * * * * echo 'hello' > /tmp/hello # 每3分钟执行命令退出保存之后就可以按照这个时间来执行命令了。
查看周期任务
使用crontab -l查看该用户的周期任务
1[root@iZ28jaak5nnZ ~]# crontab -l
215 10 1 10 * echo 'hello' > /tmp/hello
315 10 1 * * echo 'hello' > /tmp/hello
415 10 * * * echo 'hello' > /tmp/hello
515 * * * * echo 'hello' > /tmp/hello
6*/3 * * * * echo 'hello' > /tmp/hello删除周期任务
可以使用crontab -r删除当前用户所有的周期任务。
管理周期任务
每个用户都可以使用crontab -e来管理自己的周期任务,然而root用户可以使用crontab -u来管理其他用户的周期任务。只要加一个-u选项即可,参数后面接上要管理的用户就可以了。然后还是和上面的操作一样,只是多了一个这个参数而已。
如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕
评论