在 Linux 系统上,许多管理任务必须频繁地定期执行。
这些任务包括轮转日志文件以避免装满文件系统、备份数据和连接时间服务器来执行系统时间同步。
根据任务定期执行的需求不同,分为如下三种:一次性任务,周期性任务和可唤醒停机期间的任务。
本文将介绍Linux中上述三种实现任务定期执行的方式,分别是:at,cron和anacron。
其中,at是实现一次性任务控制,cron实现的是周期性控制,anacron实现可唤醒停机期间的工作任务控制。
仅运行一次的工作排程
首先,我们先来谈谈单一工作排程的运行,那就是 at 这个命令的运行!
要使用单一工作排程时,我们的 Linux 系统上面必须要有负责这个排程的服务,那就是 atd。 并非所有的 Linuxdistributions 都默认会把他打开的,打开方式如下:
[root@www ~]# /etc/init.d/atd restart 正在停止 atd: [ 确定 ] 正在启动 atd: [ 确定 ]
# 再配置一下启动时就启动这个服务,免得每次重新启动都得再来一次! [root@www ~]# chkconfig atd on |
2. 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 命令的下达最重要的地方在於『时间』的指定,示例如下:
范例一:再过五分钟后,将 /root/.bashrc寄给 root自己 [root@www ~]# at now + 5 minutes <==单位要加 s at> /bin/mail root -s "testing at job" < /root/.bashrc at> <EOT> <==这里输入 [ctrl] + d就会出现 <EOF>的字样!代表结束! 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> <EOT> 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/standarderror output 都会传送到运行者的 mailbox 去啦!所以在终端机当然看不到任何资讯。那怎办?没关系, 可以透过终端机的装置来处理!假如你在 tty1 登陆,则可以使用『 echo"Hello" > /dev/tty1 』来取代。
Tips:
要注意的是,如果在 at shell 内的命令并没有任何的信息输出,那么 at 默认不会发 email 给运行者的。
如果你想要让 at 无论如何都发一封 email 告知你是否运行了命令,可以使用『 at -m 时间格式 』来下达命令。
at 就会传送一个信息给运行者,而不论该命令运行有无信息输出了!