User-Profile-Image
hankin
  • 5
  • 首页
  • 分类
    • Windows
    • Web
    • VoIP
    • Virtualization
    • Trading
    • Smart Home
    • SEO
    • Security
    • Python
    • Program
    • PHP
    • OSX
    • OS
    • OpenSource
    • Nginx
    • MySQL
    • Mood
    • Linux
    • Life
    • Injection
    • Hosting
    • Finance
    • Exploits
    • CDN
  • 页面
    • About
  • 友链
    • 维酷科技
    • Tesra超算网络
Help?

Please contact us on our email for need any support

Support
  • 首页
    首页   ›   OS   ›   Linux   ›   正文
Linux

crontab详细使用方法

2013-04-08 02:29:10
2113  0 0

任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面, 然后以一个工作一行来编辑,编辑完毕之后,输入『 :wq 』储存后离开 vi 就可以了! 而每项工作的格式都是『 五个时间参数 实际动作指令 』,那么那五个时间参数代表什么呢?

代表意义分钟小时日期月份周
数字范围0-590-231-311-120-7

比较有趣的是那个『周』喔!当周为 0 或 7 时,都代表『星期天』的意思!另外, 还有一些辅助的字符,大概有底下这些:

特殊字符代表意义
*代表任何时刻都接受的意思!举例来说,上表的范例一,那个日、月、周都是 * , 就代表着『不论何月、何日的礼拜几的 12:00 都执行后续指令』的意思!
,代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:

    0 3,6 * * * command

还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!

–代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:

    20 8-12 * * * command

仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!

/n那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:

    */5 * * * * command

很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

我们就来搭配几个例子练习看看吧!

例题:假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 发一封信给他,这封信的内容已经写在 /home/dmtsai/lover.txt 内了,该如何进行?
答:

    • 59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
  • 直接下达 crontab -e 之后,编辑成为:那样的话,每年 kiki 都会收到你的这封信喔!(当然啰,信的内容就要每年变一变啦!)

例题:假如每五分钟需要执行 /home/dmtsai/test.sh 一次,又该如何?
答:

    • */5 * * * * /home/dmtsai/test.sh
  • 同样使用 crontab -e 进入编辑:

那个 crontab 每个人都只有一个档案存在,就是在 /var/spool/cron 里面啊! 还有建议您:『指令下达时,最好使用绝对路径,这样比较不会找不到执行档喔!』

例题:假如你每星期六都与朋友有约,那么想要每个星期五下午 4:30 告诉你朋友星期六的约会不要忘记,则:
答:

    • 30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
  • 还是使用 crontab -e 啊!

真的是很简单吧!呵呵!那么,该如何查询使用者目前的 crontab 内容呢? 我们可以这样来看看:

[dmtsai@linux ~]$ crontab -l
59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
*/5 * * * * /home/dmtsai/test.sh
30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt

# 注意,若仅想要移除一项工作而已的话,必须要用 crontab -e 去编辑~
# 如果想要全部的工作都移除,才使用 crontab -r 喔!
[dmtsai@linux ~]$ crontab -r
[dmtsai@linux ~]$ crontab -l
no crontab for dmtsai

看到了吗? crontab 『整个内容都不见了!』所以请注意:『如果只是要删除某个 crontab 的工作项目,那么请使用 crontab -e 来重新编辑即可!』如果使用 -r 的参数,是会将所有的 crontab 数据内容都删掉的!千万注意了!


系统的设定: /etc/crontab

这个『 crontab -e 』是针对使用者的 cron 来设计的,如果是『系统的例行性任务』时, 该怎么办呢?是否还是需要以 crontab -e 来管理你的例行性命令呢?当然不需要,你只要编辑 /etc/crontab这个档案就可以啦!有一点需要特别注意喔!那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 可是一个『纯文字文件』喔!你可以 root 的身份编辑一下这个档案哩!

基本上, cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个档案,并且将他储存之后,呵呵!那么 cron 的设定就自动的会来执行了!

Tips:
在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其它的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上执行, 这个时候请重新启动 crond 这个服务吧!

    /etc/init.d/crond restart

好了,我们就来看一下这个 /etc/crontab 的内容吧!

[root@linux ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01  *  *  *  *   root      run-parts /etc/cron.hourly   <==每小时
02  4  *  *  *   root      run-parts /etc/cron.daily    <==每天
22  4  *  *  0   root      run-parts /etc/cron.weekly   <==每周日
42  4  1  *  *   root      run-parts /etc/cron.monthly  <==每个月 1 号
分 时 日 月 周 执行者身份  指令串

看到这个档案的内容你大概就了解了吧!呵呵,没错!这个档案与将刚刚我们下达 crontab -e 的内容几乎完全一模一样!只是有几个地方不太相同:

  • MAILTO=root:
    这个项目是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,或者是该执行结果有 STDOUT/STDERR 时, 会将错误讯息或者是屏幕显示的讯息传给谁?预设当然是由系统直接寄发一封 mail 给 root 啦!不过, 由于 root 并无法在客户端中以 POP3 之类的软件收信,因此,我通常都将这个 e-mail 改成自己的账号,好让我随时了解系统的状况!例如: MAILTO=dmtsai@my.host.name
  • PATH=….:
    还记得我们在 BASH Shell 当中一直提到的执行文件路径问题吧!没错啦!这里就是输入执行文件的搜寻路径! 使用预设的路径设定就已经很足够了!
  • 01 * * * * root run-parts /etc/cron.hourly:
    在批注符号『 #run-parts 』这一行以后的命令,我们可以发现,五个数字后面接的是 root 喔!没错,与 crontab -e 的内容是不太一样的!这个字段的 root 代表的是『 执行的使用者身份为 root 』当然啰,你 也可以将这一行改写成其它的身份哩!而 run-parts 代表后面接的 /etc/cron.hourly 是『 一个目录内(/etc/cron.hourly)的所有可执行档 』,这也就是说,每个小时的 01 分,系统会以 root 的身份去 /etc/cron.hourly/ 这个目录下执行所有可以执行的档案!后面的三行也都是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这四个目录了!你可以将每天需要执行的命令直接写到 /etc/cron.daily/ 即可,还不需要使用到 crontab -e 的程序呢!方便吧!

基本上, /etc/crontab 这个档案里面支持两种下达指令的方式,一种是直接下达指令, 一种则是以目录来规划,例如:

  • 指令型态
    01 * * * * dmtsai mail -s “testing” kiki < /home/dmtsai/test.txt
    以 dmtsai 这个使用者的身份,在每小时执行一次 mail 指令。
  • 目录规划
    */5 * * * * root run-parts /root/runcron
    建立一个 /root/runcron 的目录,将要每隔五分钟执行的『可执行档』都写到该目录下, 就可以让系统每五分钟执行一次该目录下的所有可执行档。

这样就可以晓得 run-parts 的用意了吧!此外,与 crontab -e 规划当中最不相同的就是多了一个『使用者层级』的概念,通常我们都是以 root 的角度来规划例行性命令,但是总有不需要 root 的指令吧!就可以使用这个层级来规范该程序的使用者属于谁啰!

好!你现在大概了解了这一个咚咚吧!OK!假设你现在要作一个目录,让系统可以每 2 分钟去执行这个目录下的所有可以执行的档案,你可以写下如下的这一行在 /etc/crontab 中:

    */2 * * * * root run-parts /etc/cron.min

当然啰, /etc/cron.min 这个目录是需要存在的喔!那如果我需要执行的是一个『程序』而已, 不需要用到一个目录呢?该如何是好?例如在侦测网络流量时,我们希望每五分钟侦测分析一次, 可以这样写:

    */5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg

没有了 run-parts 就是代表『一个档案』的意思啦!

如何!?建立例行性命令很简单吧!如果你是系统管理员的话,直接修改 /etc/crontab 这个档案即可喔!又便利,又方便管理呢!


一些使用特点:

有的时候,我们以系统的 cron 来进行例行性工作的建立时,要注意一些使用方面的特性。 举例来说,如果我们有四个工作都是五分钟要进行一次的,那么是否这四个动作全部都在同一个时间点进行? 如果同时进行,该四个动作又很耗系统资源,如此一来,每五分钟不是会让系统忙得要死? 呵呵!此时好好的分配一些执行时间,呵呵!就 OK 啦!所以,注意一下:

  • 资源分配不均的问题:

    当大量使用 crontab 的时候,总是会有问题发生的,最严重的问题就是『系统资源分配不均』的问题, 以鸟哥的系统为例,我有侦测流量的信息,包括:

    • 流量
    • 区域内其它 PC 的流量侦测
    • CPU 使用率
    • RAM 使用率
    • 在线人数实时侦测

    如果每个流程都在同一个时间启动的话,呵呵!那么在某个时段时,我的系统会变的相当的繁忙, 所以,这个时候就必须要分别设定啦!我可以这样做:

    [root@linux ~]# vi /etc/crontab
    1,6,11,16,21,26,31,36,41,46,51,56 * * * * root  CMD1
    2,7,12,17,22,27,32,37,42,47,52,57 * * * * root  CMD2
    3,8,13,18,23,28,33,38,43,48,53,58 * * * * root  CMD3
    4,9,14,19,24,29,34,39,44,49,54,59 * * * * root  CMD4

    看到了没?那个『 , 』分隔的时候,请注意,不要有空格符!(连续的意思)如此一来, 则可以将每五分钟工作的流程分别在不同的时刻来工作!则可以让系统的执行较为顺畅呦!

  • 取消不要的输出项目:
    另外一个困扰发生在『 当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给 MAILTO 设定的账号 』,好啦,那么当有一个排程一直出错(例如 DNS 的侦测系统当中,若 DNS 上层主机挂掉,那么你就会一直收到错误讯息!)怎么办?呵呵!还记得 BASH 与 Shell scripts 那一章吧!?直接以『命令重导向』将输出的结果输出到 /dev/null 这个垃圾桶当中就好了!
  • 安全的检验:
    很多时候被植入木马都是以例行命令的方式植入的,所以可以藉由检查 /var/log/cron 的内容来视察是否有『非您设定的 cron 被执行了?』这个时候就需要小心一点啰!
  • ProdigYu
    180文章 77评论 4点赞 554155浏览
    随机文章
    Squid清除缓存脚本
    14年前
    怎样把一个价值0.5元苹果卖到100万元
    15年前
    2021年最新可用京东服务器时间API地址
    4年前
    Special Day
    15年前
    SFTP命令下载整个目录
    9年前
    Tags
    Apache CentOS CMD DDOS Debian DNS Docker FastCGI Google IIS IP iptables Linux Mac MySQL Nginx Opensource PHP Python Skill SSH Ubuntu Vim VMware VPN web.py Windows 删除 命令 命令提示符 安装 开源 技巧 插件 漏洞 百度 系统 组件 终端 缓存 网络电话 脚本 自建 详解 错误
    Meta
    • Log in
    • Entries feed
    • Comments feed
    • WordPress.org
    Copyright © 2025
    主页
    页面
    • About
    博主
    ProdigYu 管理员
    Something about myself
    180 文章 77 评论 554155 浏览
    测试
    测试