现在的位置: 首页 > 综合 > 正文

linux crontab and at 命令

2012年11月20日 ⁄ 综合 ⁄ 共 5470字 ⁄ 字号 评论关闭

引用地址:http://free.yes81.net/yes81/view-1179.html

crontab
命令

功能是在一定的时间间隔调度一些命令的执行。在
/etc
目录下有一个
crontab
文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度
crontab


crontab

命令有三种形式的命令行结构:

crontab [-u user]


crontab [-u user] [-e|-l|-r]
crontab -l -u [-e|-l|-r]

第一个命令行中,
file
是命令文件的名字。如果在命令行中指定了这个文件,那么执行
crontab
命令,则将这个文件拷贝到
crontabs
目录下;如果在命令行中没有制定这个文件,
crontab
命令将接受标准输入(键盘)上键入的命令,并将他们也存放在
crontab
目录下。


命令行中
-r
选项的作用是从
/usr/spool/cron/crontabs
目录下删除用户定义的文件
crontab



命令行中
-l
选项的作用是显示用户
crontab
文件的内容。


使用命令
crontab -u user -e
命令编辑用户
user

cron(c)
作业。用户通过编辑文件来增加或修改任何作业请求。


执行命令
crontab -u user -r
即可删除当前用户的所有的
cron
作业。


作业与它们预定的时间储存在文件
/usr/spool/cron/crontabs/username
里。
username
使用户名,在相应的文件中存放着该用户所要运行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。文件里的每一个请求必须包含以
spaces

tabs
分割的六个域。前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,称为命令字段,其中包括了
crontab
调度执行的命令。


第一道第五个字段的整数取值范围及意义是:

0


59
表示分

1


23
表示小时

1


31
表示日

1


12
表示月份

0


6
表示星期(其中
0
表示星期日)

/usr/lib/cron/cron.allow

表示谁能使用
crontab
命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件
/usr/lib/cron/cron.deny,
则只有不包括在这个文件中的用户才可以使用
crontab
命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时
cron.allow
优先,如果都不存在,只有超级用户可以安排作业。


任务调度的
crond
常驻命令

crond


linux
用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。
crond
命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而
linux
任务调度的工作主要分为以下两类:

1

、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

2

、个人执行的工作:某个用户定期要做的工作,例如每隔
10
分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。


一、任务调度设置文件的写法


其格式如下:

Minute Hour Day Month Dayofweek command

分钟
小时


天每星期
命令


每个字段代表的含义如下:

Minute

每个小时的第几分钟执行该任务

Hour

每天的第几个小时执行该任务

Day

每月的第几天执行该任务

Month

每年的第几个月执行该任务

DayOfWeek

每周的第几天执行该任务

Command

指定要执行的程序


在这些字段里,除了“
Command
”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“
*
”来填补其位置。


举例如下:

1

、指定每小时的第
5
分钟执行一次
ls
命令

5 * * * * ls
2

、指定每天的
5:30
执行
ls
命令

30 5 * * * ls
3

、指定每月
8
号的
7

30
分执行
ls
命令

30 7 8 * * ls
4

、指定每年的
6

8

5

30
执行
ls
命令

30 5 8 6 * ls
5

、指定每星期日的
6:30
执行
ls
命令

30 6 * * 0 ls

注:
0
表示星期天,
1
表示星期
1
,以此类推,也可以用英文来表示,
sun
表示星期天,
mon
表示星期一等。

6

、每月
10
号及
20
号的
3

30
执行
ls
命令

30 3 10,20 * * ls

注:“,”用来连接多个不连续的时段

7

、每天
8-11
点的第
25
分钟执行
ls
命令

25 8-11 * * * ls

注:“
-
”用来连接连续的时段

8

、每
15
分钟执行一次
ls
命令

*/15 * * * * ls

即每个小时的第
0 15 30 45 60
分钟执行
ls
命令

9

、每个月中,每隔
10

6:30
执行一次
ls
命令

30 6 */10 * * ls

即每月的
1

11

21

31
日是的
6

30
执行一次
ls
命令。

10

、每天
7

50

root
身份执行
/etc/cron.daily
目录中的所有可执行文件

50 7 * * * root run-parts /etc/cron.daily

注:
run-parts
参数表示,执行后面目录中的所有可执行文件。


二、新增调度任务


新增调度任务可用两种方法:

1

、在命令行输入
: crontab -e
然后添加相应的任务,
wq
存盘退出。

2

、直接编辑
/etc/crontab
文件,即
vi /etc/crontab
,添加相应的任务。


三、查看调度任务

crontab -l //

列出当前的所有调度任务

crontab -l -u jp    //

列出用户
jp
的所有调度任务


四、删除任务调度工作

crontab -r //

删除所有任务调度工作


五、任务调度执行结果的转向



1
:每天
5

30
执行
ls
命令,并把结果输出到
/jp/test
文件中

30 5 * * * ls >/jp/test 2>&1

注:
2>&1
表示执行结果及错误信息。


编辑
/etc/crontab
文件配置
cron


  
cron
服务每分钟不仅要读一次
/var/spool/cron
内的所有文件,还需要读一次
/etc/crontab,
因此我们配置这个文件也能运用
cron
服务做一些事情。用
crontab
配置是针对某个用户的,而编辑
/etc/crontab
是针对系统的任务。此文件的文件格式是
:


  
SHELL=/bin/bash


  
PATH=/sbin:/bin:/usr/sbin:/usr/bin


  
MAILTO=root //
如果出现错误,或者有数据输出,数据作为邮件发给这个帐号


  
HOME=/ //
使用者运行的路径
,
这里是根目录


  
# run-parts


  
01 * * * * root run-parts /etc/cron.hourly //
每小时执行
/etc/cron.hourly
内的脚本


  
02 4 * * * root run-parts /etc/cron.daily //
每天执行
/etc/cron.daily
内的脚本


  
22 4 * * 0 root run-parts /etc/cron.weekly //
每星期执行
/etc/cron.weekly
内的脚本


  
42 4 1 * * root run-parts /etc/cron.monthly //
每月去执行
/etc/cron.monthly
内的脚本


  大家注意
"run-parts"
这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了

以下转自鸟哥私房菜

http://linux.vbird.org/linux_basic/0430cron.php#at

 

單一工作排程的進行就使用 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> <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/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 可以讓你免除網路斷線後的困擾喔! ^_^

抱歉!评论已关闭.