首先,我们先来谈谈单一计划任务的执行,那就是 at 这个命令的执行!
atd 的启动与 at 执行的方式
要使用单一计划任务时,我们的 Linux 系统上面必须要有负责这个计划任务的服务,那就是 atd 这个玩意儿。 不过并非所有的 Linux distributions 都预设会把他打开的,所以呢,某些时刻我们必须要手动将他启用才行。 启用的方法很简单,就是这样:
[root@www ~]# /etc/init.d/atd restart 正在停止 atd: [ 确定 ] 正在激活 atd: [ 确定 ] # 再设定一下开机时就启动这个服务,免得每次重新开机都得再来一次! [root@www ~]# chkconfig atd on
● at 的执行方式
既然是计划任务,那么应该会有计划执行的方式,并且将这些任务添加到队列中啰!OK!那么计划执行的方式是怎么实现的? 事实上,我们使用 at 这个命令来产生所要执行的任务,并将这个任务以文字文件的方式写入 /var/spool/at/目录内,该任务便能等待 atd 这个服务的取用与执行了。就这么简单。不过,并不是所有的人都可以进行 at 计划任务喔!为什么?因为安全的理由啊~ 很多主机被所谓的『绑架』后,最常发现的就是他们的系统当中多了很多的黑客程序 (cracker program), 这些程序非常可能运用计划任务来执行或搜集
系统信息,并定时的回报给黑客团体! 所以啰,除非是你认可的账号,否则先不要让他们使用 at 吧!那怎么限制使用 at 的用户呢?
我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制呢! 加上这两个文件后, at 的工作情况其实是这样的:
1. 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
2. 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at ;
3. 如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。通过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为账号没有在该文件中,就能够执行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的账号写入 /etc/at.deny 即可! 一个账号写一行。
实际执行单一计划任务
单一计划任务的进行就使用 at 这个命令啰!这个命令的执行非常简单!将 at 加上一个时间即可!基本的语法如下:
[root@www ~]# at [-mldv] TIME [root@www ~]# at -c 任务号码 选项与参数: -m :当 at 的任务完成后,即使没有输出讯息,亦以 email 通知使用者该任务已完成。 -l :at -l 相当于 atq,列出目前系统上面的所有该使用者的 at 计划任务; -d :at -d 相当于 atrm ,可以取消一个在 at 计划任务中的任务; -v :可以使用较明显的时间格式列出 at 计划任务中的任务列表; -c :可以列出后面接的该项任务的实际命令内容。 TIME:时间格式,这里可以定义出『什么时候要进行 at 这项任务』的时间,格式有: HH:MM ex> 04:00 在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此任务。 HH:MM YYYY-MM-DD ex> 04:00 2009-03-17 强制规定在某年某月的某一天的特殊时刻进行该任务! HH:MM[am|pm] [Month] [Date] ex> 04pm March 17 也是一样,强制在某年某月某日的某时刻进行! HH:MM[am|pm] + number [minutes|hours|days|weeks] ex> now + 5 minutes ex> 04pm + 3 days
就是说,在某个时间点『再加几个时间后』才进行。
老实说,这个 at 命令的下达最重要的地方在于『时间』的指定了!鸟哥喜欢使用『 now + … 』 的方式来定义现在过多少时间再进行任务,但有时也需要定义特定的时间点来进行!底下的例子先看看啰!
例子一:再过五分钟后,将 /root/.bashrc 寄给 root 自己
[root@www ~]# at now + 5 minutes <==记得单位要加 s 喔! at> /bin/mail root -s "testing at job" < /root/.bashrc at> <==这里输入 [ctrl] + d 就会出现 的字样!代表结束! job 4 at 2009-03-14 15:38 # 上面这行信息在说明,第 4 个 at 任务将在 2009/03/14 的 15:38 进行! # 而执行 at 会进入所谓的 at shell 环境,让你下达多重命令等待执行!
例子二:将上述的第 4 项任务内容列出来查阅
[root@www ~]# at -c 4
#!/bin/sh <==就是透过 bash shell 的啦!
# atrun uid=0 gid=0
# mail root 0
umask 22
....(中间省略许多的环境变量项目)....
cd /root || { <==可以看出,会到下达 at 时的任务目录去执行命令 echo 'Execution directory inaccessible' >&2
exit 1
}
/bin/mail root -s "testing at job" < /root/.bashrc
# 你可以看到命令执行的目录 (/root),还有多个环境变量与实际的命令内容啦!
例子三:由于机房预计于 2009/03/18 停电,我想要在 2009/03/17 23:00 关机?
[root@www ~]# at 23:00 2009-03-17 at> /bin/sync at> /bin/sync at> /sbin/shutdown -h now at> job 5 at 2009-03-17 23:00 # 您瞧瞧! at 还可以在一个任务内输入多个命令呢!不错吧!
事实上,当我们使用 at 时会进入一个 at shell 的环境来让使用者下达任务命令,此时,建议你最好使用绝对路径来下达你的命令,比较不会有问题喔!由于命令的下达与 PATH 变量有关, 同时与当时的任务目录也有关连 (如果有牵涉到文件的话),因此使用绝对路径来下达命令,会是比较一劳永逸的方法。 为什么呢?举例来说,你在 /tmp 下达『 at now 』然后输入『 mail root -s “test” < .bashrc 』, 问一下,那个 .bashrc 的文件会是在哪里?答案是『 /tmp/.bashrc 』!因为 at 在执行时,会跑到当时下达 at 命令的那个任务目录的缘故啊!有些朋友会希望『我要在某某时刻,在我的终端机显示出 Hello 的字样』,然后就在 at 里面下达这样的信息『 echo “Hello” 』。等到时间到了,却发现没有任何讯息在屏幕上显示,这是啥原因啊?这是因为 at 的执行与终端机环境无关,而所有 standard output/standard error output 都会传送到执行者的 mailbox 去啦!所以在终端机当然看不到任何信息提示。那怎办?没关系, 可以透过终端机的装置来处理!假如你在 tty1 登入,则可以使用『 echo “Hello” > /dev/tty1 』来替代。
Tips:
要注意的是,如果在 at shell 内的命令并没有任何的讯息输出,那么 at 预设不会发email 给执行者的。 如果你想要让 at 无论如何都发一封 email 告知你是否执行了指令,那么可以使用『 at -m 时间格式 』来下达命令喔! at 就会传送一个讯息给执行者,而不论该命令执行有无讯息输出了!
at 有另外一个很棒的优点,那就是『背景执行』的功能了!什么是背景执行啊?很难了解吗?其实与 bash 的 nohup 类似啦! 鸟哥提我自己的几个例子来给您听听,您就明白了!
● 离线继续任务的任务:鸟哥初次接触 Unix 为的是要跑空气质量模式, 那是一种大型的程序,这个程序在当时的硬件底下跑,一个案例要跑 3 天!由于鸟哥也要进行其它研究任务,因此常常使用 Windows 98 来联机到Unix 任务站跑那个 3 天的案例!结果你也该知道, Windows 98 连开三天而不当机的机率是很低的~@_@~而当机时,所有在 Windows 上的联机都会中断!包括鸟哥在跑的那个程序也中断了~呜呜~明明再三个钟头就跑完的程序, 由于当机害我又得跑 3 天!
● 另一个常用的时刻则是例如上面的例子三,由于某个突发状况导致你必须要进行某项任务时,这个 at 就很好用啦!
由于 at 计划任务的使用上,系统会将该项 at 任务独立出你的 bash 环境中, 直接交给系统的 atd 程序来接管,因此,当你下达了 at 的任务之后就可以立刻离线了, 剩下的任务就完全交给 Linux 管理即可!所以啰,如果有长时间的网络任务时,嘿嘿! 使用 at 可以让你免除网络断线后的困扰喔! ^_^
● at 任务的管理
那么万一我下达了 at 之后,才发现命令输入错误,该如何是好?就将他移除啊!利用 atq 与 atrm 吧!
[root@www ~]# atq [root@www ~]# atrm (jobnumber)
例子一:查询目前主机上面有多少的 at 计划任务?
[root@www ~]# atq 5 2009-03-17 23:00 a root # 上面说的是:『在 2009/03/17 的 23:00 有一项任务,该项任务命令下达者为 # root』而且,该项任务的任务号码 (jobnumber) 为 5 号喔!
例子二:将上述的第 5 个任务移除!
[root@www ~]# atrm 5 [root@www ~]# atq # 没有任何信息,表示该任务被移除了!
如此一来,你可以利用 atq 来查询,利用 atrm 来删除错误的命令,利用 at 来直接下达单一计划任务!很简单吧! 不过,有个问题需要处理一下。如果你是在一个非常忙碌的系统下执行 at , 能不能指定你的任务在系统较闲的时候才进行呢?可以的,那就使用 batch 命令吧!
● batch:系统有空时才进行背景任务
其实 batch 是利用 at 来进行命令的下达啦!只是加入一些控制参数而已。这个 batch 神奇的地方在于:他会在 CPU任务负载小于 0.8 的时候,才进行你所下达的任务任务啦! 那什么是负载 0.8 呢?这个负载的意思是: CPU 在单一时间点所负责的任务数量。不是 CPU 的使用率喔! 举例来说,如果我有一只程序他需要一直使用 CPU 的运算功能,那么此时 CPU 的使用率可能到达 100% , 但是 CPU 的任务负载则是趋近于『 1 』,因为 CPU 仅负责一个任务嘛!如果同时执行这样的程序两支呢? CPU 的使用率还是 100% ,但是任务负载则变成 2 了!了解乎?
所以也就是说,当 CPU 的任务负载越大,代表 CPU 必须要在不同的任务之间进行频繁的任务切换。 这样的 CPU 运作情况我们在第零章有谈过,忘记的话请回去瞧瞧!因为一直切换任务,所以会导致系统忙碌啊! 系统如果很忙碌,还要额外进行 at ,不太合理!所以才有 batch 命令的产生!
那么 batch 如何下达命令呢?很简单啊!与 at 相同啦!例如下面的例子:
例子一:同样是机房停电在 2009/3/17 23:00 关机,但若当时系统负载太高,则暂缓执行
[root@www ~]# batch 23:00 2009-3-17 at> sync at> sync at> shutdown -h now at> job 6 at 2009-03-17 23:00 [root@www ~]# atq 6 2009-03-17 23:00 b root [root@www ~]# atrm 6
你会发现其实 batch 也是使用 atq/atrm 来管理的!这样了解乎?
译自:鸟哥私房菜Linux基础



