Linux探索之旅 | 第三部分第五课:延时执行,唯慢不破

《Linux探索之旅》全系列

内容简介


  1. 第三部分第五课:延时执行,唯慢不破
  2. 第三部分第六课预告:第三部分测验题

延时执行,唯慢不破


上一课 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命令的使用顺序如下:

  1. 先用at命令后接想要程序执行的确定时刻

  2. 再输入你想要在以上指定时刻执行的命令

例如:

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文件。

猜你喜欢

转载自www.linuxidc.com/Linux/2017-05/143813.htm
今日推荐