由于本人的不严谨,在某篇帖子里误导了楼主,向该楼主道歉了。
感谢苏姐及时地纠正了我的错误,还给我下面的链接,让我又学习了一个新的工具。
可是里面都是 E 语,好吧我会好好学习 E 语的。E 语好的同学可以参考。我通过《Beginning Unix》的中文版学习了一下
相关的内容。做了下面的笔记。
当是作业交给大家了。
和我一样之前不会的也可以参考,我们共同学习。
本笔记主要是关于如何在指定的时间内执行命令,脚本和程序的。用到了 corn 和 at 这两个工具。
- 启动 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
可以看到已经在运行了。
- 配置 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
可以看到已经在运行了。
- 配置 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
这样就完成了一个部署
- 原理
我们先看最前面的东西。
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 * *
- 管理 corn 输出
corn 的输出都会以电子邮件的方式传送给进程所有者,可以用管道输出以电子邮件的方式传给他人。也可以利用重定向将命令的输出定到某个文件,这样你就可以查看了。
- 控制访问
指定用户有没有权访问 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 就是你的账户名,这样在执行好任务后你就会受到电子邮件,直接在终端敲入
就可以查看执行的信息了。
好了,就是这些,欢迎挑错批评。