您的位置:首页 > 运维架构 > Shell

Linux & Unix shell 编程指南之cron命令

2011-11-07 20:00 134 查看
1 后台执行命令

cron :系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。

At at :命令。使用它在一个特定的时间运行一些特殊的作业,或在晚一些的非负荷高峰时间段或高峰负荷时间段运行。

& :使用它在后台运行一个占用时间不长的进程。

Nohup :使用它在后台运行一个命令,即使在用户退出时也不受影响。

2 cron和crontab

cron 是系统主要的调度进程,可以在无需人工干预的情况下运行作业。

有个 crontab 命令允许用户提交、编辑或删除相应的作业。

每一个用户都可以有一个 crontab 文件来保存调度信息。可以使用它运行任意一个shell脚本或某个命令,每小时运行一次,或一周三次,这完全取决于你。

每一个用户都可以有自己的 crontab 文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。系统管理员是通过 cron.deny

和 cron.allow 这两个文件来禁止或允许用户拥有自己的 crontab文件。

2.1 crontab的域

为了能够在特定的时间运行作业,需要了解 crontab文件每个条目中各个域的意义和格式。

第1列 分钟 0~59

第2列 小时 0~23(0表示子夜)

第3列 日 1~31

第4列 月 1~12

第5列 星期 0~6(0表示星期天)

第6列 年 1970~2099可选

第7列 要运行的命令



* * * * * * command to be executed

_ _ _ _ _ _

| | | | | |

| | | | | +----- year (1970-2099) (optional, if not be used, you can keep blank)

| | | | +----- day of week (0 - 6) (Sunday=0)

| | | +------- month (1 - 12)

| | +--------- day of month (1 - 31)

| +----------- hour (0 - 23)

+------------- min (0 - 59)

如果某一项设置了多个参数,可以用“,”隔开,例如3,4,5,6这样。

如果是几个连续的数字构成的参数,可以用用“-”吧首尾相连,例如3-6。

crontab 的格式如下:

分< >时< >日< >月< >星期< >要运行的命令,其中< >表示空格。

Crontab 文件的一个条目是从左边读起的,第一列是分,最后一列是要运行的命令,它位于星期的后面。

在这些域中,可以用横杠 "-" 来表示一个时间范围,例如希望星期一至星期五运行某个作业,那么可以在星期域使用 1-5来表示。还可以在这些域中使用逗号 "," ,例如希望星期一和星期四运行某个作业,只需要使用 1,4 来表示。可以用星号 * 来表示连续的时间段。如果你对某个表示时间的域没有特别的限定,也应该在该域填入 * 。该文件的每一个条目必须含有5个时间域,而且每个域之间要用空格分隔。该文件中所有的注释行要在行首用 # 来表示。

crontab 文件条目 例子:

30 21* * * /apps/bin/cleanup.sh

上面的例子表示每晚的21:30 运行 /apps/bin目录下的 cleanup.sh。

45 4 1,10,22 * * /apps/bin/backup.sh

上面的例子表示每月1、1 0、2 2日的 4:45 运行 /apps/bin目录下的backup.sh。

10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;

上面的例子表示每周六、周日的1:10运行一个find命令。

0,30 18-23 * * * /apps/bin/dbcheck.sh

上面的例子表示在每天 18:00至23:00之间每隔30分钟运行 /apps/bin目录下的 dbcheck.sh。

0 23 * * 6 /apps/bin/qtrend.sh

上面的例子表示每星期六的11:00pm运行 /apps/bin目录下的 qtrend.sh。

上面例子中,每个命令都给出了绝对路径。当使用 crontab 运行 shell 脚本时,用户要给出脚本的绝对路径,设置相应的环境变量。记住,既然是用户向 cron提交了这些作业,就要向 cron 提供所需的全部环境。不要假定 cron 知道所需要的特殊环境,它其实并不知道。

所以要保证在 shell 脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。

如果 cron 不能运行相应的脚本,用户将会收到一个邮件说明其中的原因。

2.2 crontab命令选项

crontab 命令的一般形式为:

Crontab [-u user] -e -l -r

其中:

-u 用户名。

-e 编辑 crontab 文件。

-l 列出 crontab 文件中的内容。

-r 删除 crontab 文件。

如果使用自己的名字登录,就不用使用 -u选项,因为在执行 crontab 命令时,该命令能够知道当前的用户。

2.3 创建一个新的 crontab 文件

在向 cron 进程提交一个 crontab 文件之前,首先要做的一件事情就是设置环境变量EDITOR。

cron 进程根据它来确定使用哪个编辑器编辑 crontab 文件。99% 的UNIX和LINUX用户使用vi,如果你也是这样,那么你就编辑 $HOME目录下的 .profile 文件,在其中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。

不妨创建一个名为 <user>cron 的文件,其中<user>是用户名,如lanseyokeycron。

首先创建一个s hell 文件如 time.sh

echo "Now time is:"

date

然后打开文件 lanseyokeucron 加入如下的内容:

# echo the date to the console every

# 15 minutes between 6am and 6pm on Sunday

0,15,30,45 06-18 * * 0 /lanseyokey/time.sh

保存并退出,确信前面5个域用空格分隔。

在上面的例子中,系统将每隔 15 分钟输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。

为了提交刚刚创建的 crontab 文件,可以把这个新创建的文件作为 cron 命令的参数:

$ crontab lanseyokeycron

现在该文件已经提交给 cron 进程,它将每隔 15 分钟运行一次。

同时,新创建文件的一个副本已经被放在 /var/spool/cron 目录中,文件名就是用户名(即,lanseyokey)。

2.4 列出crontab文件

为了列出 crontab 文件,可以用:

$ cron -l

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# (lanseyokeycron installed on Sun Dec 20 11:28:00 2009)

# (Cron vesion -- $Id: crontab.c.v 2.13 1994/01/17 04:20:37 vixie Exp $)

# echo the date to the console every

# 15 minutes between 6am and 6pm on Sunday

0,15,30,45 06-18 * * 0 /lanseyokey/time.sh

注意:若是以lanseyokey用户名登录则不需使用 -u 选项,否则使用

$ crontab -u lanseyokey -l

可以使用这种方法在 $HOME 目录中对 crontab 文件做一备份:

$ crontab -l > $HOME/mycron

2.5 编辑 crontab 文件

如果希望添加、删除或编辑 crontab 文件中的条目,而 EDITOR环境变量又设置为 vi,那么就可以用 vi 来编辑 crontab 文件,相应的命令为:

$ crontab -e

可以像使用 vi 编辑其他任何文件那样修改 crontab 文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron 会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

在编辑 crontab 文件时,没准会加入新的条目。例如,加入下面的一条:

# echo greeting to user

0 06-18 * * * /bin/echo "Hello, Welcome to Linux"

保存并退出。最好在 crontab 文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ cron -u lanseyokey -l

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# (lanseyokeycron installed on Sun Dec 20 11:28:00 2009)

# (Cron vesion -- $Id: crontab.c.v 2.13 1994/01/17 04:20:37 vixie Exp $)

# echo the date to the console every

# 15 minutes between 6am and 6pm on Sunday

0,15,30,45 06-18 * * 0 /lanseyokey/time.sh

# echo greeting to user

0 06-18 * * * /bin/echo "Hello, Welcome to Linux"

删除 crontab 文件,可以用:

$ crontab -r

恢复丢失的 crontab 文件如果不小心误删了 crontab 文件,假设你在自己的 $HOME 目录下还有一个备份,那么可以将其拷贝到 /var/spool/cron/<username>,其中<username>是用户名。

如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename> 是你在 $HOME 目录中副本的文件名。

建议在自己的 $HOME 目录中保存一个该文件的副本,因为r键紧挨在e键的右边,很容易误删。

有些系统文档建议不要直接编辑 crontab 文件,而是编辑该文件的一个副本,然后重新提交新的文件。有些 crontab 的变体有些怪异,所以在使用 crontab 命令时要格外小心。

如果遗漏了任何选项,crontab 可能会打开一个空文件,或者看起来像是个空文件,这时敲delete 键退出,不要按<Ctrl-D>,否则将丢失 crontab 文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: