Cron 和 at 的学习笔记

由于本人的不严谨,在某篇帖子里误导了楼主,向该楼主道歉了。
感谢苏姐及时地纠正了我的错误,还给我下面的链接,让我又学习了一个新的工具。

en.openSUSE.org/SDB:Cron

可是里面都是 E 语,好吧我会好好学习 E 语的。E 语好的同学可以参考。我通过《Beginning Unix》的中文版学习了一下
相关的内容。做了下面的笔记。

当是作业交给大家了。
和我一样之前不会的也可以参考,我们共同学习。

本笔记主要是关于如何在指定的时间内执行命令,脚本和程序的。用到了 corn 和 at 这两个工具。

  1. 启动 cron

运行一下命令。

sudo /usr/sbin/cron

该进程会自动转后台。

好吧,其实不用启动,它会在系统启动时自动运行,且一直处于潜伏状态。否则怎么帮助我们定时执行任务?

可以用 ps(process status)命令来查看

ps auwx | grep cron

我的输出是

root 2060 0.0 0.0 3716 1224 ? Ss 16:07 0:00 /usr/sbin/cron -n
nirvana 3611 0.0 0.0 4236 768 pts/1 S+ 16:20 0:00 grep --color=auto cron

可以看到已经在运行了。

  1. 配置 crontab 文件

crontab 文件在目录 /etc 里面,我们就在这个文件里面写入我们要指定时间运行的命令,脚本或程序。
用 vim 打开(注意要用 root 权限)

sudo vim /etc/crontab

我的输出是

root 2060 0.0 0.0 3716 1224 ? Ss 16:07 0:00 /usr/sbin/cron -n
nirvana 3611 0.0 0.0 4236 768 pts/1 S+ 16:20 0:00 grep --color=auto cron

可以看到已经在运行了。

  1. 配置 crontab 文件

crontab 文件在目录 /etc 里面,我们就在这个文件里面写入我们要指定时间运行的命令,脚本或程序。

用 vim 打开(注意要用 root 权限)

sudo vim /etc/crontab

打开后在会发现如下内容

SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root

check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly

-*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1

我们在行末添加

0 * * * * userid cp -r ~username/docs ~username/backups

这样就完成了一个部署

  1. 原理

我们先看最前面的东西。
SHELL 指 cron 将在其下运行 shell
PATH 指包含在 cron 搜索路径中的目录。
MALTO 指如果 cron 运行的命令有输出,那么这个输出就会以电子邮件的形式传送给指定用户。这里就是 root
书里还有一个 HOME, 作者解释为 cron 应用程序指定的主目录。也许是各个发行版之间的差异,openSUSE 里面没有,不知道添加上去有没有效果,回头有时间我去试一下。

这些内容都是可以更改的。

下面看添加的代码
这个代码是我们分成两部分看,从 cp 开始的是命令,应该是熟悉的,其中~username 指的是你的主目录,这个命令就是吧主目录下的 docs 备份到 backups 里(当然你要先要有这两个文件夹了)

主要是前面的那些东西,我们一个字段一个字段地来看。

(1)就是那么 0 了。值得是分钟,取值范围是 0 到 59。0 代表的是整点。
(2)就是第一个 *。指小时,如果是要每个小时都执行的话就用 *(下面的类推)
(3)代表日期,范围是 1 到 31
(4)代表月份,范围是 1 得 12(也可以是 Jan 到 Dec,用英文缩写可能看上去清楚一点)
(5)代表星期,范围是 1 到 7, 也可以是 Sun 到 Sat

好了前面几个就是要执行的时间了,那么上面命令执行的时间就是每天的每个整点。

那么

0 0 * * *

的意思就是每天的 0 点 0 分执行。

要注意的是,日期里的 Jan 之类不区分大小写。还有

  • 12 16 * 1
    的意思不是说只有 16 号又是星期天才执行,而是 16 和星期天都会执行。

(6)就是那个 userid,指的是运行命令的用户。
(7)这个就是命令。

4 . 稍稍复杂一点的调度

在多个小时执行但不是每一个。

1 0,2,4,6,8,10,12,14,16,18,20,22 * * *

注意,字段之间空格隔开,同一个字段用逗号隔开,逗号两边没有空格。

在一到五周执行

        • 1-5

每隔五小时执行

  • */5 * * *

还可以把日期范围(如 10-16) 和步值(如 /2)结合。

  • 12 10-16/2 * *
  1. 管理 corn 输出

corn 的输出都会以电子邮件的方式传送给进程所有者,可以用管道输出以电子邮件的方式传给他人。也可以利用重定向将命令的输出定到某个文件,这样你就可以查看了。

  1. 控制访问

指定用户有没有权访问 cron,书里提到了 cron.allow 和 cron.deny。顾名思义,只要在文件里添加就可以了。我在 openSUSE 里找了一下,发现 openSUSE 里只有 cron.deny 没有 cron.allow。
想想也是,一个就够用了

由于 linux 往往是多用户的,不是每个人都可以访问 /etc/crontab 的。每个用户可以创建自己的 crontab 文件,只要终端输入

crontab -e

这个命令用来编辑或创建用户自己的 crontab 文件

crontab -l

列出 crontab 文件的内容(当然是你自己的)

crontab - r

删除 crontab 文件(同样,是你自己的)

7 at

用来执行一次性的任务。

很简单终端输入

at 17:00

后面那个时间当然可以自己改了

会出来

warning: commands will be executed using /bin/sh
at>

在提示符后输入你要执行的命令就是了。完了 Crtl + D 退出

用 atq 可以查看是否安排好了

如果要删除则使用 atrm + 任务编号。用 atq 查看时最前面那个数字就是了。

8 一个实例

好吧,就是我误导人家的那个。正确定时刷新软件源的方法是在 crontab 文件里添加

0 22 * * * root zypper ref | mail usrname

时间自己定啦,最后那个 usrname 就是你的账户名,这样在执行好任务后你就会受到电子邮件,直接在终端敲入

mail

就可以查看执行的信息了。

好了,就是这些,欢迎挑错批评。

1赞

crond 有很多。你讲的这个貌似是很多发行版默认的 cronie。
我目前在用 dcron,小巧且不需要 anacron,而且同一任务只会运行一个(想想,一个更新数据的任务由于任务多,到它下次执行的时候前一个还没执行完。cronie 里可以使用 flock 命令找个文件加锁)。
另据称 fcron 很强大很厉害,但是强大的东西总是会比较复杂……

原来是这样,一定要去尝试一下。

PS: 感谢回复指导~