《Linux探索之旅》全系列
内容简介
- 第三部分第五课:延时执行,唯慢不破
- 第三部分第六课预告:第三部分测验题
延时执行,唯慢不破
上一课 Linux探索之旅 | 第三部分第四课:后台运行及合并多个终端 中,我们学习了后台进程以及如何在一个终端里打开多个虚拟终端。
到目前为止,我们所运行的命令都是立即执行的。也就是我们按下回车键的那一刻,命令就开始执行了。
其实,在Linux中,命令还可以延时执行。这一课我们就来学习几个命令,可以帮助我们“稍后”执行程序。比如我们即将学习到的crontab命令。
虽说“天下武功,唯快不破”。
但有时,延时执行命令是很有必要的。
这一课新学的命令都涉及到时间的观念,所以我们先来学习有关系统时间的规格。
date命令:调节时间
早期的课程中,我们已經介绍过date命令了。但那时我们只学习了date命令的最基本用法:输出当前时间。
date命令的基本用法就是输入date,然后回车:
输出信息的含义我们以前解释过了,再复习一次吧。从左到右依次是:
-
Sat:Saturday的缩写,表示“礼拜六”。
-
Sep:September的缩写,表示“九月”。
扫描二维码关注公众号,回复: 1960976 查看本文章 -
19:19日,也就是9月19日。
-
23:07:41:23点07分41秒。
-
CEST:所在时区。CEST是Central European Summer Time的缩写,表示《欧洲中部夏令时间》,比世界标准时间(UTC)早两个小时的时区名称。
-
2015:2015年。
定制date的输出
date命令其实挺强大的,它不仅可以输出当前时间,而且如果用man date来查看date命令的手册,就可以发现我们还可以自定义它的输出:可以选择输出哪部分信息,输出格式以及输出的顺序。
为了自定义date命令的输出,我们需要用到+号,后接其他的符号,表示不同的定制部分,这些信息最好都写在双引号间。我们来看几个例子,你就会使用了:
date "+%H"
可以看到,输出是 00。
表示当前的小时数是00,因为H是hour的首字母,表示《小时》。
再来一个复杂点的:
date "+%H:%M:%S"
可以看到,在刚才+%H的基础上,添加了%M和%S,分别表示分钟数和秒数。因为M是英语minute的首字母,表示《分钟》;S是英语second的首字母,表示《秒》。
所以以上命令用于显示当前的小时数,分钟数和秒数。我们用自定义的冒号来分隔三个部分信息。
当然了,我们也可以自定义其他的分隔字符,例如:
date "+%H时%M分%S秒"
可以看到,经过定制,我们的显示变得更加人性化了。只有紧跟%号之后的符号会被解析,而其他如《时,分,秒》等信息则原样输出。
那小编怎么知道%M就是表示分钟呢?因为小编看date命令的手册了啊。
因此,我也知道如何显示年份:
date "+现在是%Y年"
还有其他各种输出的定制,好好看手册,你可以自由发挥。
用date修改系统时间
date命令还可以修改系统时间。是的,你没有看错。
修改系统时间需要使用root身份,因此我们可以这样做:
sudo date 12101250
date命令后接的参数可以是多种形式的,此处的12101250表示《12月10日12点50分》,没有指定年份和秒数,所以年份和秒数不变。
再次用date命令输出当前系统时间,可以看到已经改为了
Thu Dec 10 12:50:02 CET 2015
表示《星期二 十二月 10日 12点50分02秒 欧洲中部时间 2015年》。
你可以手动再修改回原来的系统时间。
当然,你也可以设定系统时间和网络的时间同步。
在System->Administration->Time and Date里,选择《Keep synchronized with Internet servers》,表示《与互联网的服务器同步》(默认是手动修改系统时间的)。然后在下面的Time servers里可以选择你想要同步的时间服务器,小编选择的是法国的。它会让你安装ntp这个程序,选择确定安装。
之后,Linux系统就会和指定的时间服务器同步了。就不用担心时间不对了,当然,需要在联网的情况下才可以。
at命令:延时执行一个程序
你想要延时执行一个程序(所有的命令说到底都是程序)吗?没问题。我们可以用at命令来设定一个程序的执行时间。
at是英语《在...时刻》的意思。
注意:at命令只能让程序执行一次。
如果你要定时重复执行程序,那就要用crontab命令,本课的最后一节我们会学到。
at命令有几种用法,我们先来看第一种:
在指定时刻执行程序
在这种用法下,at命令的使用顺序如下:
-
先用at命令后接想要程序执行的确定时刻
-
再输入你想要在以上指定时刻执行的命令
例如:
at 17:12
回车,
终端会显示at>,提示你输入要在17点12分执行的命令。
我们可以输入
touch file.txt
表示我们想要在17点12分创建一个文件,名叫file.txt。
然后,回车。at命令会继续显示at>,提示你输入在指定时刻想要执行的其他命令。你可以继续输入。但你也可以就此打住。
那么怎么结束输入退出at命令呢?可以使用Ctrl + D组合键,at会显示<EOT>,表示《End Of Transmission》(表示《传输结束》)。然后会打印出一句话:
job 1 at Sun Sep 20 17:12:00 2015
上面这句话表示:
-
job:英语《工作,任务》的意思,表示创建了一个任务。
-
1:是job的编号。表示第1号任务。
-
at:"在...时刻",也正是at命令的作用所在。
-
Sun:Sunday的缩写。是英语《星期日》的意思。
-
Sep:September,英语《九月》的意思。
-
20:20日。9月20日。
-
17:12:00:命令执行的时刻。17点12分00秒,也就是我们用 at 17:12 指定的时间。
-
2015:2015年。
之后,到了17点12分,就会创建file.txt这个文件了。
如果说我们不想要在今天的17点12分执行指定命令,而想要在明天的17点12分执行,怎么做呢?可以这样:
at 17:12 tomorrow
tomorrow是英语《明天》的意思。
那我要在2015年12月10日的17点12分执行呢?
at 17:12 12/10/15
日期的格式是美国日期的格式,所以是 12/10/15,依次是《月/日/年》。
在指定间隔之后执行程序
at还有第二种用法,就是在指定时间间隔之后执行程序。
例如,我要在10分钟之后执行指定程序:
at now +10 minutes
now表示《现在》,+10 minutes表示《10分钟之后》,所以就是《现在开始的10分钟之后执行》。
这里我随便写了一个命令:
cp file.txt file_copy.txt
所以,job 2被创建了,就是在现在开始的10分钟会执行《拷贝file.txt文件到file_copy.txt》。
当然了,不止minutes这个关键字可以使用,我们列出几乎所有可以使用的关键字:
-
minutes:表示《分钟》。
-
hours:表示《小时》。
-
days:表示《天》。
-
weeks:表示《星期》。
-
months:表示《月》。
-
years:表示《年》。
例如:
at now +7 weeks
表示在距今7个星期之后执行。
atq和atrm命令:列出和删除正在等待执行的at任务
每次我们用at命令指定延时执行的命令,at都会为其分配一个job编号,比如我们上面的两个例子,分别被分配了1和2的编号。1号是touch file.txt,2号是cp file.txt file_copy.txt。
atq命令可以列出正等待执行的at任务。q是英语queue的首字母,queue表示《队列》,会列出at命令的任务队列。
atrm命令可以删除正在等待执行的at任务。rm是英语remove的首字母,remove表示《删除》。后接at任务的编号。例如1和2这样的编号。
我们来实际操作一下:
可以看到,我们用atq命令列出了at任务,有两个,就是我们上面设定的两个延时任务,分别会在17点12分和1点38分执行。
然后我们用atrmyici删除了这两个任务,因此就不会执行任何任务了。
sleep命令:休息一会
其实,我们可以用分号隔开多个命令,使之一个接一个执行。跟之前的管道不一样,管道是前一个命令的输出作为后一个命令的输入。用分号隔开的各个命令并没有关联。例如:
touch file.txt ; rm file.txt
上面用分号隔开的两句命令的作用:创建file.txt文件,然后删除之。
我们在两句命令之前可以插入一定的暂停等待时间,用sleep命令。
sleep是英语“睡觉,睡眠”的意思。
touch file.txt ; sleep 10 ; rm file.txt
上面的三句命令分别表示:
-
touch file.txt :创建文件file.txt
-
sleep 10 :暂停10秒
-
rm file.txt :删除file.txt
默认地,sleep后面的数值表示秒数。但我们也可以指定其表示分钟或小时或天:
-
m:minute的缩写,表示《分钟》。
-
h:hour的缩写,表示《小时》。
-
d:day的缩写,表示《天》。
例如:
touch file.txt ; sleep 15m ; rm file.txt
上面的三句命令会依次执行:创建file.txt文件,暂停15分钟,删除file.txt文件。