Shawn's Blog
目录 · 11 节

Linux 中计划任务和周期任务

0X00 Linux中的计划任务

我们使用Linux更多的时候是在服务器上,然而我们有的时候就需要让计算机在固定的某个时间做一些事情。比如我们就可能有有如下需求:

  1. 临时有事需要离开电脑,但是一个小时后需要备份某个目录里的文件
  2. 写了个爬虫去抓取某网站的新闻,每隔十分钟就去爬取一次
  3. 周期性的执行某脚本,但放在后台的话退出ssh就会被自动关掉
  4. 其实还有好多这种可能…

在Linux中有两种常见的任务管理,一个是at也就是在某时做某事,另一个是crontab也就是周期性任务表。使用at可以方便地给Linux设置一个在什么时候做什么事的计划,用crontab可以方便地给Linux设置我要做某事,多久做一次。

0X01 使用at命令

检查atd服务是否开启

atd就是at命令的守护进程,系统默认是打开着的,但是也有可能被关掉,在RHEL系中可以使用systemctl status atd来查看服务是否已经开启,没有开启的话可以用systemctl restart atd来打开服务

创建一个计划任务

先创建一个在今天的21:09的任务,任务内容是输出hello,world重定向到/hello文件。然后到时间之后再检查这个文件是否出现了。当我们只指定时分的时候,默认是当天,如果已经过了的时间的话,会默认为次日。

sh
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模式,此时计划任务创建完毕,系统会提示你计划任务的执行时间。

下面还有几个例子

sh
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计划任务。

sh
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 root

0X02 使用crontab命令

  • 这里的配置分成六段

分---时---日---月---周---命令

创建周期任务

使用任何一个用户登陆到系统之后,就可以执行crontab -e就进入了vi的编辑器模式,然后我们来编辑这个文件就可以创建/修改周期任务了。

sh
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查看该用户的周期任务

sh
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选项即可,参数后面接上要管理的用户就可以了。然后还是和上面的操作一样,只是多了一个这个参数而已。

本文标题
Linux 中计划任务和周期任务
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论