Linux任务调度(一)—at

来源:互联网 发布:java打印乘法表 编辑:程序博客网 时间:2024/05/21 06:26

在 Linux 系统上,许多管理任务必须频繁地定期执行。
这些任务包括轮转日志文件以避免装满文件系统、备份数据和连接时间服务器来执行系统时间同步。
根据任务定期执行的需求不同,分为如下三种:一次性任务,周期性任务和可唤醒停机期间的任务。
本文将介绍Linux中上述三种实现任务定期执行的方式,分别是:at,cron和anacron。
其中,at是实现一次性任务控制,cron实现的是周期性控制,anacron实现可唤醒停机期间的工作任务控制。

仅运行一次的工作排程

首先,我们先来谈谈单一工作排程的运行,那就是 at 这个命令的运行!

1.      atd 的启动与 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 即可! 一个帐号写一行。

3.      实际运行单一工作排程

单一工作排程的进行就使用 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 就会传送一个信息给运行者,而不论该命令运行有无信息输出了!

0 0