当前位置: 首页 > news >正文

建网站找谁wordpress生成海报图片

建网站找谁,wordpress生成海报图片,开家网站设计公司,win7做网站服务器【BASH】回顾与知识点梳理 二十八 二十八. 例行性工作排程(crontab)28.1 什么是例行性工作排程Linux 工作排程的种类#xff1a; at, cronCentOS Linux 系统上常见的例行性工作 28.2 仅执行一次的工作排程atd 的启动at 的运作方式实际运作单一工作排程at 工作的管理batch… 【BASH】回顾与知识点梳理 二十八 二十八. 例行性工作排程(crontab)28.1 什么是例行性工作排程Linux 工作排程的种类 at, cronCentOS Linux 系统上常见的例行性工作 28.2 仅执行一次的工作排程atd 的启动at 的运作方式实际运作单一工作排程at 工作的管理batch系统有空时才进行背景任务 28.3 循环执行的例行性工作排程使用者的设定 28.4 系统的配置文件 /etc/crontab, /etc/cron.d/*crond 服务读取配置文件的位置一些注意事项资源分配不均的问题取消不要的输出项目安全的检验周与日月不可同时并存 28.5 可唤醒停机期间的工作任务什么是 anacronanacron 与 /etc/anacrontab 该系列目录 -- 【BASH】回顾与知识点梳理目录 二十八. 例行性工作排程(crontab) 学习了基础篇也一阵子了你会发现到为什么系统常常会主动的进行一些任务这些任务到底是谁在设定工作的 如果你想要让自己设计的备份程序可以自动的在系统底下执行而不需要手动来启动他又该如何处置 这些例行的工作可能又分为『单一』工作与『循环』工作在系统内又是哪些服务在负责 还有还有如果你想要每年在老婆的生日前一天就发出一封信件提醒自己不要忘记可以办的到吗 嘿嘿这些种种要如何处理就看看这一章先 28.1 什么是例行性工作排程 那么 Linux 的例行性工作是如何进行排程的呢所谓的排程就是将这些工作安排执行的流程之意咱们的 Linux 排程就是透过 crontab 与 at 这两个东西这两个玩意儿有啥异同就让我们来瞧瞧先 Linux 工作排程的种类 at, cron 从上面的说明当中我们可以很清楚的发现两种工作排程的方式 一种是例行性的就是每隔一定的周期要来办的事项一种是突发性的就是这次做完以后就没有的那一种 那么在 Linux 底下如何达到这两个功能呢那就得使用 at 与 crontab 这两个好东西啰 at at 是个可以处理仅执行一次就结束排程的指令不过要执行 at 时 必须要有 atd 这个服务的支援才行。在某些新版的 distributions 中atd 可能预设并没有启动那么 at 这个指令就会失效呢不过我们的 CentOS 预设是启动的crontab crontab 这个指令所设定的工作将会循环的一直进行下去 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务喔 CentOS Linux 系统上常见的例行性工作 如果你曾经使用过 Linux 一阵子了那么你大概会发现到 Linux 会主动的帮我们进行一些工作呢比方说自动的进行在线更新 (on-line update)、自动的进行 updatedb更新文件名数据库、自动的作登录档分析 (所以 root 常常会收到标题为 logwatch 的信件) 等等。这是由于系统要正常运作的话 某些在背景底下的工作必须要定时进行的缘故。基本上 Linux 系统常见的例行性任务有 进行登录档的轮替 (log rotate) Linux 会主动的将系统所发生的各种信息都记录下来这就是登录档。由于系统会一直记录登录信息所以登录文件将会越来越大我们知道大型文件不但占容量还会造成读写效能的困扰 因此适时的将登录文件数据挪一挪让旧的数据与新的数据分别存放则比较可以有效的记录登录信息。这就是log rotate的任务这也是系统必要的例行任务登录文件分析 logwatch 的任务 如果系统发生了软件问题、硬件错误、资安问题等绝大部分的错误信息都会被记录到登录文件中 因此系统管理员的重要任务之一就是分析登录档。但你不可能手动透过 vim 等软件去检视登录文件因为数据太复杂了 我们的 CentOS 提供了一只程序『 logwatch 』来主动分析登录信息所以你会发现你的 root 老是会收到标题为 logwatch 的信件那是正常的你最好也能够看看该信件的内容喔建立 locate 的数据库 在前文我们谈到的 locate 指令时 我们知道该指令是透过已经存在的文件名数据库来进行系统上文件名的查询。我们的文件名数据库是放置到/var/lib/mlocate/中。 问题是这个数据库怎么会自动更新啊嘿嘿这就是系统的例行性工作所产生的效果啦系统会主动的进行 updatedb 喔man page 查询数据库的建立 与 locate 数据库类似的可提供快速查询的 man page db 也是个数据库但如果要使用 man page 数据库时就得要执行 mandb 才能够建立好啊 而这个 man page 数据库也是透过系统的例行性工作排程来自动执行的哩RPM 软件登录文件的建立 RPM 是一种软件管理的机制。由于系统可能会常常变更软件 包括软件的新安装、非经常性更新等都会造成软件文件名的差异。为了方便未来追踪系统也帮我们将文件名作个排序的记录呢 有时候系统也会透过排程来帮忙 RPM 数据库的重新建置喔移除暂存档 某些软件在运作中会产生一些暂存档但是当这个软件关闭时这些暂存盘可能并不会主动的被移除。 有些暂存盘则有时间性如果超过一段时间后这个暂存盘就没有效用了此时移除这些暂存盘就是一件重要的工作 否则磁盘容量会被耗光。系统透过例行性工作排程执行名为tmpwatch的指令来删除这些暂存档呢与网络服务有关的分析行为 如果你有安装类似 WWW 服务器软件 (一个名为 apache 的软件)那么你的 Linux 系统通常就会主动的分析该软件的登录文件。 同时某些凭证与认证的网络信息是否过期的问题我们的 Linux 系统也会很亲和的帮你进行自动检查 28.2 仅执行一次的工作排程 首先我们先来谈谈单一工作排程的运作那就是 at 这个指令的运作 atd 的启动 要使用单一工作排程时我们的 Linux 系统上面必须要有负责这个排程的服务那就是 atd 这个玩意儿。 不过并非所有的 Linux distributions 都预设会把他打开的所以呢某些时刻我们必须要手动将他启用才行。 启用的方法很简单就是这样 [rootstudy ~]# systemctl restart atd # 重新启动 atd 这个服务 [rootstudy ~]# systemctl enable atd # 让这个服务开机就自动启动 [rootstudy ~]# systemctl status atd # 查阅一下 atd 目前的状态at 的运作方式 我们使用 at 这个指令来产生所要运作的工作并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内该工作便能等待 atd 这个服务的取用与执行了。就这么简单。 不过并不是所有的人都可以进行 at 工作排程喔为什么因为安全的理由啊 很多主机被所谓的『绑架』后最常发现的就是他们的系统当中多了很多的怪客程序 (cracker program) 这些程序非常可能运用工作排程来执行或搜集系统信息并定时的回报给怪客团体 所以啰除非是你认可的账号否则先不要让他们使用 at 吧那怎么达到使用 at 的列管呢 我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制呢 加上这两个文件后at 的工作情况其实是这样的 先找寻 /etc/at.allow 这个文件写在这个文件中的使用者才能使用 at 没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中)如果/etc/at.allow不存在就寻找 /etc/at.deny 这个文件若写在这个 at.deny 的使用者则不能使用 at 而没有在这个 at.deny 文件中的使用者就可以使用 at 咯如果两个文件都不存在那么只有 root 可以使用 at 这个指令。 透过这个说明我们知道 /etc/at.allow 是管理较为严格的方式而 /etc/at.deny 则较为松散 (因为账号没有在该文件中就能够执行 at 了)。在一般的 distributions 当中由于假设系统上的所有用户都是可信任的 因此系统通常会保留一个空的 /etc/at.deny 文件意思是允许所有人使用 at 指令的意思 (您可以自行检查一下该文件)。 不过万一你不希望有某些使用者使用 at 的话将那个使用者的账号写入 /etc/at.deny 即可 一个账号写一行。 实际运作单一工作排程 单一工作排程的进行就使用 at 这个指令啰这个指令的运作非常简单将 at 加上一个时间即可基本的语法如下 [rootstudy ~]# at [-mldv] TIME [rootstudy ~]# 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 2015-07-30强制规定在某年某月的某一天的特殊时刻进行该工作HH:MM[am|pm] [Month] [Date] ex 04pm July 30也是一样强制在某年某月某日的某时刻进行HH:MM[am|pm] number [minutes|hours|days|weeks]ex now 5 minutes ex 04pm 3 days就是说在某个时间点『再加几个时间后』才进行。# 范例一再过五分钟后将 /root/.bashrc 寄给 root 自己 [rootstudy ~]# at now 5 minutes 记得单位要加 s 喔 at /bin/mail -s testing at job root /root/.bashrc at EOT 这里输入 [ctrl] d 就会出现 EOF 的字样代表结束 job 2 at Thu Jul 30 19:35:00 2015 # 上面这行信息在说明第 2 个 at 工作将在 2015/07/30 的 19:35 进行 # 而执行 at 会进入所谓的 at shell 环境让你下达多重指令等待运作# 范例二将上述的第 2 项工作内容列出来查阅 [rootstudy ~]# at -c 2 #!/bin/sh 就是透过 bash shell 的啦 # atrun uid0 gid0 # mail root 0 umask 22 ....(中间省略许多的环境变量项目).... cd /etc/cron\.d || {echo Execution directory inaccessible 2exit 1 } ${SHELL:-/bin/sh} marcinDELIMITER410efc26 /bin/mail -s testing at job root /root/.bashrc # 这一行最重要 marcinDELIMITER410efc26 # 你可以看到指令执行的目录 (/root)还有多个环境变量与实际的指令内容啦# 范例三由于机房预计于 2015/08/05 停电我想要在 2015/08/04 23:00 关机 [rootstudy ~]# at 23:00 2015-08-04 at /bin/sync at /bin/sync at /sbin/shutdown -h now at EOT job 3 at Tue Aug 4 23:00:00 2015 # 您瞧瞧 at 还可以在一个工作内输入多个指令呢不错吧事实上当我们使用 at 时会进入一个 at shell 的环境来让用户下达工作指令此时建议你最好使用绝对路径来下达你的指令比较不会有问题喔由于指令的下达与 PATH 变量有关 同时与当时的工作目录也有关连 (如果有牵涉到文件的话)因此使用绝对路径来下达指令会是比较一劳永逸的方法。为什么呢举例来说你在 /tmp 下达『 at now 』然后输入『 mail -s “test” root .bashrc 』问一下那个 .bashrc 的文件会是在哪里答案是『 /tmp/.bashrc 』因为 at 在运作时会跑到当时下达 at 指令的那个工作目录的缘故啊 有些朋友会希望『我要在某某时刻在我的终端机显示出 Hello 的字样』然后就在 at 里面下达这样的信息『 echo “Hello” 』。等到时间到了却发现没有任何讯息在屏幕上显示这是啥原因啊这是因为 at 的执行与终端机环境无关而所有 standard output/standard error output 都会传送到执行者的 mailbox 去啦所以在终端机当然看不到任何信息。那怎办没关系 可以透过终端机的装置来处理假如你在 tty1 登入则可以使用『 echo Hello /dev/tty1 』来取代。 要注意的是如果在 at shell 内的指令并没有任何的讯息输出那么 at 默认不会发email 给执行者的。 如果你想要让 at 无论如何都发一封 email 告知你是否执行了指令那么可以使用『 at -m 时间格式 』来下达指令喔 at 就会传送一个讯息给执行者而不论该指令执行有无讯息输出了 at 有另外一个很棒的优点那就是『背景执行后台执行』的功能了 脱机继续工作的任务鸟哥初次接触 Unix 为的是要跑空气质量模式 那是一种大型的程序这个程序在当时的硬件底下跑一个案例要跑 3 天由于鸟哥也要进行其他研究工作因此常常使用 Windows 98 (你没看错鸟哥是老人…) 来联机到 Unix 工作站跑那个 3 天的案例结果你也该知道 Windows 98 连开三天而不当机的机率是很低的_ 而当机时所有在 Windows 上的联机都会中断包括鸟哥在跑的那个程序也中断了呜呜明明再三个钟头就跑完的程序 由于当机害我又得跑 3 天另一个常用的时刻则是例如上面的范例三由于某个突发状况导致你必须要进行某项工作时这个 at 就很好用啦 由于 at 工作排程的使用上系统会将该项 at 工作独立出你的 bash 环境中 直接交给系统的 atd 程序来接管因此当你下达了 at 的工作之后就可以立刻脱机了 剩下的工作就完全交给 Linux 管理即可所以啰如果有长时间的网络工作时嘿嘿 使用 at 可以让你免除网络断线后的困扰喔^_^ at 工作的管理 那么万一我下达了 at 之后才发现指令输入错误该如何是好就将他移除啊利用 atq 与 atrm 吧 [rootstudy ~]# atq #查询 [rootstudy ~]# atrm (jobnumber) #移除# 范例一查询目前主机上面有多少的 at 工作排程 [rootstudy ~]# atq 3 Tue Aug 4 23:00:00 2015 a root # 上面说的是『在 2015/08/04 的 23:00 有一项工作该项工作指令下达者为 # root』而且该项工作的工作号码 (jobnumber) 为 3 号喔# 范例二将上述的第 3 个工作移除 [rootstudy ~]# atrm 3 [rootstudy ~]# atq # 没有任何信息表示该工作被移除了如此一来你可以利用 atq 来查询利用 atrm 来删除错误的指令利用 at 来直接下达单一工作排程很简单吧 不过有个问题需要处理一下。如果你是在一个非常忙碌的系统下运作 at 能不能指定你的工作在系统较闲的时候才进行呢可以的那就使用 batch 指令吧 batch系统有空时才进行背景任务 其实 batch 是利用 at 来进行指令的下达啦只是加入一些控制参数而已。这个 batch 神奇的地方在于他会在 CPU 的工作负载小于 0.8 的时候才进行你所下达的工作任务啦 那什么是工作负载0.8 呢这个工作负载的意思是 CPU 在单一时间点所负责的工作数量。不是 CPU 的使用率喔举例来说如果我有一只程序他需要一直使用 CPU 的运算功能那么此时 CPU 的使用率可能到达100% 但是 CPU 的工作负载则是趋近于『 1 』因为 CPU 仅负责一个工作嘛如果同时执行这样的程序两支呢 CPU 的使用率还是 100% 但是工作负载则变成 2 了了解乎 所以也就是说当 CPU 的工作负载越大代表 CPU 必须要在不同的工作之间进行频繁的工作切换。这样的 CPU 运作情况我们在第零章有谈过忘记的话请回去瞧瞧因为一直切换工作所以会导致系统忙碌啊 系统如果很忙碌还要额外进行 at 不太合理所以才有 batch 指令的产生 在 CentOS 7 底下的 batch 已经不再支持时间参数了因此 batch 可以拿来作为判断是否要立刻执行背景程序的依据 我们底下来实验一下 batch 好了为了产生 CPU 较高的工作负载因此我们用了 12 章里面计算 pi 的脚本连续执行 4 次这只程序 来仿真高负载然后来玩一玩 batch 的工作现象 # 范例一请执行 pi 的计算然后在系统闲置时执行 updatdb 的任务 [rootstudy ~]# echo scale100000; 4*a(1) | bc -lq [rootstudy ~]# echo scale100000; 4*a(1) | bc -lq [rootstudy ~]# echo scale100000; 4*a(1) | bc -lq [rootstudy ~]# echo scale100000; 4*a(1) | bc -lq # 然后等待个大约数十秒的时间之后再来确认一下工作负载的情况 [rootstudy ~]# uptime 19:56:45 up 2 days, 19:54, 2 users, load average: 3.93, 2.23, 0.96 [rootstudy ~]# batch at /usr/bin/updatedb at EOT job 4 at Thu Jul 30 19:57:00 2015 [rootstudy ~]# date;atq Thu Jul 30 19:57:47 CST 2015 4 Thu Jul 30 19:57:00 2015 b root # 可以看得到明明时间已经超过了却没有实际执行 at 的任务 [rootstudy ~]# jobs [1] Running echo scale100000; 4*a(1) | bc -lq [2] Running echo scale100000; 4*a(1) | bc -lq [3]- Running echo scale100000; 4*a(1) | bc -lq [4] Running echo scale100000; 4*a(1) | bc -lq [rootstudy ~]# kill -9 %1 %2 %3 %4 # 这时先用 jobs 找出背景工作再使用 kill 删除掉四个背景工作后慢慢等待工作负载的下降 [rootstudy ~]# uptime; atq 20:01:33 up 2 days, 19:59, 2 users, load average: 0.89, 2.29, 1.40 4 Thu Jul 30 19:57:00 2015 b root [rootstudy ~]# uptime; atq 20:02:52 up 2 days, 20:01, 2 users, load average: 0.23, 1.75, 1.28 # 在 19:59 时由于 loading 还是高于 0.8因此 atq 可以看得到 at job 还是持续再等待当中喔 # 但是到了 20:01 时 loading 降低到 0.8 以下了所以 atq 就执行完毕啰使用 uptime 可以观察到 1, 5, 15 分钟的『平均工作负载』量因为是平均值所以当我们如上表删除掉四个工作后工作负载不会立即降低 需要一小段时间让这个 1 分钟平均值慢慢回复到接近 0 啊当小于 0.8 之后的『整分钟时间』时atd 就会将 batch 的工作执行掉了 什么是『整分钟时间』呢不论是 at 还是底下要介绍的 crontab他们最小的时间单位是『分钟』所以基本上他们的工作是『每分钟检查一次』来处理的 就是整分 (秒为 0 的时候)这样了解乎同时你会发现其实 batch 也是使用 atq/atrm 来管理的 28.3 循环执行的例行性工作排程 相对于 at 是仅执行一次的工作循环执行的例行性工作排程则是由 cron (crond) 这个系统服务来控制的。刚刚谈过 Linux 系统上面原本就有非常多的例行性工作因此这个系统服务是默认启动的。另外 由于使用者自己也可以进行例行性工作排程所以啰 Linux 也提供使用者控制例行性工作排程的指令 (crontab)。 底下我们分别来聊一聊啰 使用者的设定 使用者想要建立循环型工作排程时使用的是 crontab 这个指令啦不过为了安全性的问题与 at 同样的我们可以限制使用 crontab 的使用者账号喔使用的限制数据有 /etc/cron.allow 将可以使用 crontab 的账号写入其中若不在这个文件内的使用者则不可使用 crontab/etc/cron.deny 将不可以使用 crontab 的账号写入其中若未记录到这个文件当中的使用者就可以使用 crontab 。 与 at 很像吧同样的以优先级来说 /etc/cron.allow 比 /etc/cron.deny 要优先 而判断上面这两个文件只选择一个来限制而已因此建议你只要保留一个即可 免得影响自己在设定上面的判断一般来说系统默认是保留 /etc/cron.deny 你可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中一个账号一行 当用户使用 crontab 这个指令来建立工作排程之后该项工作就会被纪录到 /var/spool/cron/ 里面去了而且是以账号来作为判别的喔举例来说 dmtsai 使用 crontab 后 他的工作会被纪录到/var/spool/cron/dmtsai 里头去但请注意不要使用 vi 直接编辑该文件 因为可能由于输入语法错误会导致无法执行 cron 喔另外 cron 执行的每一项工作都会被纪录到 /var/log/cron 这个登录档中所以啰如果你的 Linux 不知道有否被植入木马时也可以搜寻一下 /var/log/cron 这个登录档呢 好了那么我们就来聊一聊 crontab 的语法吧 [rootstudy ~]# crontab [-u username] [-l|-e|-r] 选项与参数 -u 只有 root 才能进行这个任务亦即帮其他使用者建立/移除 crontab 工作排程 -e 编辑 crontab 的工作内容 -l 查阅 crontab 的工作内容 -r 移除所有的 crontab 的工作内容若仅要移除一项请用 -e 去编辑。# 范例一用 dmtsai 的身份在每天的 12:00 发信给自己 [dmtsaistudy ~]$ crontab -e # 此时会进入 vi 的编辑画面让您编辑工作注意到每项工作都是一行。0 12 * * * mail -s at 12:00 dmtsai /home/dmtsai/.bashrc #分 时 日 月 周 |指令串|预设情况下任何使用者只要不被列入 /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 相同意思 我们就来搭配几个例子练习看看吧底下的案例请实际用 dmtsai 这个身份作看看喔后续的动作才能够搭配起来 假若你的女朋友生日是 5 月 2 日你想要在 5 月 1 日的 23:59 发一封信给他这封信的内容已经写在/home/dmtsai/lover.txt 内了该如何进行 答直接下达crontab -e之后编辑成为59 23 1 5 * mail kiki /home/dmtsai/lover.txt那样的话每年 kiki 都会收到你的这封信喔当然啰信的内容就要每年变一变啦 假如每五分钟需要执行 /home/dmtsai/test.sh 一次又该如何 答同样使用 crontab -e 进入编辑*/5 * * * * /home/dmtsai/test.sh 那个 crontab 每个人都只有一个文件存在就是在 /var/spool/cron 里面啊 还有建议您『指令下达时最好使用绝对路径这样比较不会找不到执行档喔』 假如你每星期六都与朋友有约那么想要每个星期五下午 4:30 告诉你朋友星期六的约会不要忘记则 答还是使用 crontab -e 啊30 16 * * 5 mail friendhis.server.name /home/dmtsai/friend.txt 该如何查询使用者目前的 crontab 内容呢我们可以这样来看看 [dmtsaistudy ~]$ crontab -l 0 12 * * * mail -s at 12:00 dmtsai /home/dmtsai/.bashrc 59 23 1 5 * mail kiki /home/dmtsai/lover.txt */5 * * * * /home/dmtsai/test.sh 30 16 * * 5 mail friendhis.server.name /home/dmtsai/friend.txt # 注意若仅想要移除一项工作而已的话必须要用 crontab -e 去编辑 # 如果想要全部的工作都移除才使用 crontab -r 喔 [dmtsaistudy ~]$ crontab -r [dmtsaistudy ~]$ crontab -l no crontab for dmtsai28.4 系统的配置文件 /etc/crontab, /etc/cron.d/* 这个『 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 的设定就自动的会来执行了 在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项但是某些原因或者是其他的 Unix 系统中由于 crontab 是读到内存当中的所以在你修改完 /etc/crontab 之后可能并不会马上执行 这个时候请重新启动 crond 这个服务吧『systemctl restart crond』 废话少说我们就来看一下这个 /etc/crontab 的内容吧 [rootstudy ~]# cat /etc/crontab SHELL/bin/bash 使用哪种 shell 接口 PATH/sbin:/bin:/usr/sbin:/usr/bin 执行文件搜寻路径 MAILTOroot 若有额外 STDOUT以 email 将数据送给谁 # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed看到这个文件的内容你大概就了解了吧呵呵没错这个文件与将刚刚我们下达 crontab -e 的内容几乎完全一模一样只是有几个地方不太相同 MAILTOroot 当 /etc/crontab 这个文件中的例行性工作的指令发生错误时或者是该工作的执行结果有 STDOUT/STDERR 时会将错误讯息或者是屏幕显示的讯息传给谁默认当然是由系统直接寄发一封 mail 给 root 啦不过 由于 root 并无法在客户端中以 POP3 之类的软件收信因此鸟哥通常都将这个 e-mail 改成自己的账号好让我随时了解系统的状况例如MAILTOdmtsaimy.host.namePATH… 这里就是输入执行文件的搜寻路径使用默认的路径设定就已经很足够了『分 时 日 月 周 身份 指令』七个字段的设定 这个 /etc/crontab 里面可以设定的基本语法与 crontab -e 不太相同喔前面同样是分、时、日、月、周五个字段 但是在五个字段后面接的并不是指令而是一个新的字段那就是『执行后面那串指令的身份』为何这与使用者的 crontab -e 不相同。由于使用者自己的 crontab 并不需要指定身份但 /etc/crontab 里面当然要指定身份啦以上表的内容来说系统默认的例行性工作是以 root 的身份来进行的。 crond 服务读取配置文件的位置 一般来说crond 预设有三个地方会有执行脚本配置文件他们分别是 /etc/crontab/etc/cron.d/*/var/spool/cron/* 这三个地方中跟系统的运作比较有关系的两个配置文件是放在 /etc/crontab 文件内以及/etc/cron.d/* 目录内的文件 另外一个是跟用户自己的工作比较有关的配置文件就是放在/var/spool/cron/ 里面的文件群。 现在我们已经知道了 /var/spool/cron 以及 /etc/crontab 的内容那现在来瞧瞧 /etc/cron.d 里面的东西吧 [rootstudy ~]# ls -l /etc/cron.d -rw-r--r--. 1 root root 128 Jul 30 2014 0hourly -rw-r--r--. 1 root root 108 Mar 6 10:12 raid-check -rw-------. 1 root root 235 Mar 6 13:45 sysstat -rw-r--r--. 1 root root 187 Jan 28 2014 unbound-anchor # 其实说真的除了 /etc/crontab 之外crond 的配置文件还不少耶上面就有四个设定 # 先让我们来瞧瞧 0hourly 这个配置文件的内容吧 [rootstudy ~]# cat /etc/cron.d/0hourly # Run the hourly jobs SHELL/bin/bash PATH/sbin:/bin:/usr/sbin:/usr/bin MAILTOroot 01 * * * * root run-parts /etc/cron.hourly # 瞧一瞧内容跟 /etc/crontab 几乎一模一样但实际上是有设定值喔就是最后一行如果你想要自己开发新的软件该软件要拥有自己的 crontab 定时指令时就可以将『分、时、日、月、周、身份、指令』的配置文件放置到 /etc/cron.d/ 目录下 在此目录下的文件是『crontab 的配置文件脚本』。 请注意一下上面表格中提到的最后一行每个整点的一分会执行『run-parts /etc/cron.hourly』这个指令咦那什么是 run-parts 呢 如果你有去分析一下这个执行档会发现他就是 shell scriptrun-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有执行文件因此放在 /etc/cron.hourly/ 的文件必须是能被直接执行的指令脚本 而不是分、时、日、月、周的设定值喔注意注意 也就是说除了自己指定分、时、日、月、周加上指令路径的 crond 配置文件之外你也可以直接将指令放置到(或链接到)/etc/cron.hourly/ 目录下则该指令就会被 crond 在每小时的 1 分开始后的5 分钟内随机取一个时间点来执行啰你无须手动去指定分、时、日、月、周就是了。 但是眼尖的朋友可能还会发现除了可以直接将指令放到 /etc/cron.hourly/ 让系统每小时定时执行之外在 /etc/ 底下其实还有 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/那三个目录是代表每日、每周、每月各执行一次的意思吗嘿嘿 厉害喔没错是这样不过跟 /etc/cron.hourly/ 不太一样的是那三个目录是由 anacron 所执行的而 anacron 的执行方式则是放在/etc/cron.hourly/0anacron 里面耶跟前几代 anacron 是单独的 service 不太一样喔这部份留待下个小节再来讨论。 最后让我们总结一下吧 个人化的行为使用『 crontab -e 』如果你是依据个人需求来建立的例行工作排程建议直接使用 crontab -e 来建立你的工作排程较佳 这样也能保障你的指令行为不会被大家看到 (/etc/crontab 是大家都能读取的权限喔)系统维护管理使用『 vim /etc/crontab 』如果你这个例行工作排程是系统的重要工作为了让自己管理方便同时容易追踪建议直接写入 /etc/crontab 较佳自己开发软件使用『 vim /etc/cron.d/newfile 』如果你是想要自己开发软件那当然最好就是使用全新的配置文件并且放置于 /etc/cron.d/ 目录内即可。固定每小时、每日、每周、每天执行的特别工作如果与系统维护有关还是建议放置到 /etc/crontab 中来集中管理较好。 如果想要偷懒或者是一定要再某个周期内进行的任务也可以放置到上面谈到的几个目录中直接写入指令即可 一些注意事项 有的时候我们以系统的 cron 来进行例行性工作的建立时要注意一些使用方面的特性。 举例来说如果我们有四个工作都是五分钟要进行一次的那么是否这四个动作全部都在同一个时间点进行如果同时进行该四个动作又很耗系统资源如此一来每五分钟的某个时刻不是会让系统忙得要死呵呵此时好好的分配一些运行时间就 OK 啦所以注意一下 资源分配不均的问题 当大量使用 crontab 的时候总是会有问题发生的最严重的问题就是『系统资源分配不均』的问题以鸟哥的系统为例我有侦测主机流量的信息包括 流量区域内其他 PC 的流量侦测CPU 使用率RAM 使用率在线人数实时侦测 如果每个流程都在同一个时间启动的话那么在某个时段时我的系统会变的相当的繁忙所以这个时候就必须要分别设定啦我可以这样做 [rootstudy ~]# vim /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 上层主机挂掉那么你就会一直收到错误讯息怎么办呵呵还记得数据流重导向吧 直接以『数据流重导向』将输出的结果输出到 /dev/null 这个垃圾桶当中就好了 安全的检验 很多时候被植入木马都是以例行命令的方式植入的所以可以藉由检查 /var/log/cron 的内容来视察是否有『非您设定的 cron 被执行了』这个时候就需要小心一点啰 周与日月不可同时并存 另一个需要注意的地方在于『你可以分别以周或者是日月为单位作为循环但你不可使用「几月几号且为星期几」的模式工作』。 这个意思是说你不可以这样编写一个工作排程 30 12 11 9 5 root echo just test 这是错误的写法本来你以为九月十一号且为星期五才会进行这项工作无奈的是系统可能会判定每个星期五作一次或每年的 9 月 11 号分别进行如此一来与你当初的规划就不一样了所以啰得要注意这个地方 28.5 可唤醒停机期间的工作任务 想象一个环境你的 Linux 服务器有一个工作是需要在每周的星期天凌晨 2 点进行但是很不巧的星期六停电了所以你得要星期一才能进公司去启动服务器。 那么请问这个星期天的工作排程还要不要进行因为你开机的时候已经是星期一所以星期天的工作当然不会被进行对吧 问题是若是该工作非常重要 (例如例行备份) 所以其实妳还是希望在下个星期天之前的某天还是进行一下比较好那你该怎办自己手动执行如果你跟鸟哥一样是个记忆力超差的家伙那么肯定『记不起来某个重要工作要进行』的啦 这时候就得要靠 anacron 这个指令的功能了这家伙可以主动帮你进行时间到了但却没有执行的排程喔 什么是 anacron anacron 并不是用来取代 crontab 的anacron 存在的目的就在于我们上头提到的在处理非 24 小时一直启动的 Linux 系统的 crontab 的执行 以及因为某些原因导致的超过时间而没有被执行的排程工作。 其实 anacron 也是每个小时被 crond 执行一次然后 anacron 再去检测相关的排程任务有没有被执行如果有超过期限的工作在 就执行该排程任务执行完毕或无须执行任何排程时anacron 就停止了。 由于 anacron 预设会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务因此对于某些特殊的使用环境非常有帮助。 举例来说如果你的 Linux 主机是放在公司给同仁使用的因为周末假日大家都不在所以也没有必要开启 因此你的 Linux 是周末都会关机两天的。但是 crontab 大多在每天的凌晨以及周日的早上进行各项任务 偏偏你又关机了此时系统很多 crontab 的任务就无法进行。anacron 刚好可以解决这个问题 那么 anacron 又是怎么知道我们的系统啥时关机的呢这就得要使用 anacron 读取的时间记录文件(timestamps) 了 anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间两者比较后若发现有差异 那就是在某些时刻没有进行 crontab 啰此时 anacron 就会开始执行未进行的 crontab 任务了 anacron 与 /etc/anacrontab anacron 其实是一支程序并非一个服务这支程序在 CentOS 当中已经进入 crontab 的排程喔同时anacron 会每个小时被主动执行一次喔 咦每个小时所以 anacron 的配置文件应该放置在/etc/cron.hourly/ 吗嘿嘿您真内行赶紧来瞧一瞧 [rootstudy ~]# cat /etc/cron.hourly/0anacron #!/bin/sh # Check whether 0anacron was run today already if test -r /var/spool/anacron/cron.daily; thendaycat /var/spool/anacron/cron.daily fi if [ date %Y%m%d $day ]; thenexit 0; fi # 上面的语法在检验前一次执行 anacron 时的时间戳 # Do not run jobs when on battery power if test -x /usr/bin/on_ac_power; then/usr/bin/on_ac_power /dev/null 21if test $? -eq 1; thenexit 0fi fi /usr/sbin/anacron -s # 所以其实也仅是执行 anacron -s 的指令因此我们得来谈谈这支程序基本上 anacron 的语法如下 [rootstudy ~]# anacron [-sfn] [job].. [rootstudy ~]# anacron -u [job].. 选项与参数 -s 开始一连续的执行各项工作 (job)会依据时间记录文件的数据判断是否进行 -f 强制进行而不去判断时间记录文件的时间戳 -n 立刻进行未进行的任务而不延迟 (delay) 等待时间 -u 仅更新时间记录文件的时间戳不进行任何工作。 job 由 /etc/anacrontab 定义的各项工作名称。在我们的 CentOS 中anacron 的进行其实是在每个小时都会被抓出来执行一次 但是为了担心anacron 误判时间参数因此/etc/cron.hourly/ 里面的 anacron 才会在档名之前加个 0 (0anacron)让anacron 最先进行就是为了让时间戳先更新以避免 anacron 误判 crontab 尚未进行任何工作的意思。 接下来我们看一下 anacron 的配置文件 /etc/anacrontab 的内容好了 [rootstudy ~]# cat /etc/anacrontab SHELL/bin/sh PATH/sbin:/bin:/usr/sbin:/usr/bin MAILTOroot RANDOM_DELAY45 # 随机给予最大延迟时间单位是分钟 START_HOURS_RANGE3-22 # 延迟多少个小时内应该要执行的任务时间 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly monthly 45 cron.monthly nice run-parts /etc/cron.monthly 天数 延迟时间 工作名称定义 实际要进行的指令串 # 天数单位为天延迟时间单位为分钟工作名称定义可自定义指令串则通常与 crontab 的设定相同 [rootstudy ~]# more /var/spool/anacron/* :::::::::::::: /var/spool/anacron/cron.daily :::::::::::::: 20150731 :::::::::::::: /var/spool/anacron/cron.monthly :::::::::::::: 20150703 :::::::::::::: /var/spool/anacron/cron.weekly :::::::::::::: 20150727 # 上面则是三个工作名称的时间记录文件以及记录的时间戳我们拿 /etc/cron.daily/ 那一行(1 5 cron.daily nice run-parts /etc/cron.daily)的设定来说明好了。那四个字段的意义分别是 天数anacron 执行当下与时间戳 (/var/spool/anacron/ 内的时间纪录文件) 相差的天数若超过此天数就准备开始执行若没有超过此天数则不予执行后续的指令。延迟时间若确定超过天数导致要执行排程工作了那么请延迟执行的时间因为担心立即启动会有其他资源冲突的问题吧工作名称定义这个没啥意义就只是会在 /var/log/cron 里头记载该项任务的名称这样通常与后续的目录资源名称相同即可。实际要进行的指令串有没有跟 0hourly 很像啊没错相同的作法啊透过 run-parts 来处理的 根据上面的配置文件内容我们大概知道 anacron 的执行流程应该是这样的 (以 cron.daily 为例) 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳由上个步骤与目前的时间比较若差异天数为 1 天以上 (含 1 天)就准备进行指令若准备进行指令根据 /etc/anacrontab 的设定将延迟 5 分钟 3 小时 (看 START_HOURS_RANGE 的设定)延迟时间过后开始执行后续指令亦即『 run-parts /etc/cron.daily 』这串指令执行完毕后 anacron 程序结束。 如此一来放置在 /etc/cron.daily/ 内的任务就会在一天后一定会被执行的因为 anacron 是每个小时被执行一次嘛 所以现在你知道为什么隔了一阵子才将 CentOS 开机开机过后约 1 小时左右系统会有一小段时间的忙碌而且硬盘会跑个不停那就是因为 anacron 正在执行过去/etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里头的未进行的各项工作排程啦这样对 anacron 有没有概念了呢 ^_^ 最后我们来总结一下本章谈到的许多配置文件与目录的关系吧这样我们才能了解 crond 与anacron 的关系 crond 会主动去读取 /etc/crontab, /var/spool/cron/*, /etc/cron.d/* 等配置文件并依据『分、时、日、月、周』的时间设定去各项工作排程根据 /etc/cron.d/0hourly 的设定主动去 /etc/cron.hourly/ 目录下执行所有在该目录下的执行文件因为 /etc/cron.hourly/0anacron 这个脚本文件的缘故主动的每小时执行 anacron 并呼叫 /etc/anacrontab 的配置文件根据 /etc/anacrontab 的设定依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的执行文件以进行固定周期需要执行的指令。 也就是说如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话那么该动作只要过期了就过期了并不会被抓回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下那么该工作就会定期几乎一定会在一周内执行一次如果你关机超过一周那么一开机后的数个小时内该工作就会主动的被执行喔 真的吗对啦因为 /etc/anacrontab 的定义啦 基本上crontab 与 at 都是『定时』去执行过了时间就过了不会重新来一遍那anacron 则是『定期』去执行某一段周期的执行 因此两者可以并行并不会互相冲突啦 该系列目录 -- 【BASH】回顾与知识点梳理目录
http://www.w-s-a.com/news/146805/

相关文章:

  • 做网站选哪家好搜索引擎优化的目标体系包括哪些
  • 做数据可视化的网站ppt2016是制作网页的软件
  • 济宁市建设工程质量监督站网站徐州网站优化推广
  • 北京网站设计多少钱php做商品网站
  • 能打开的网站你了解的彩票网站开发dadi163
  • 手机做网站价格优秀企业网站建设价格
  • 电商网站建设企业做网站的客户多吗
  • 有做思维图的网站吗西安建设市场诚信信息平台网站
  • 网站建设求职具备什么30岁学网站开发
  • 官方网站minecraft北京低价做网站
  • 网站建设报价兴田德润机械加工网络接单
  • 免费的推广网站安卓app制作平台
  • 长春火车站附近美食建设信用卡银行积分兑换商城网站
  • 网站提交网址如何备份wordpress网页
  • 龙腾盛世网站建设医院管理系统
  • 网站切换图片做背景怎么写外贸营销邮件主题一般怎么写
  • 基于html5的网站开发wordpress主题工具
  • php网站开发的成功经历公司网站现状
  • 软件发布网站源码中国企业公示信息网
  • flash 的网站网站型销售怎么做
  • 营销型网站单页网站的域名和密码
  • 建网站保定seo自动发布外链工具
  • 做公众号关注网站做课件用这15大网站
  • 怎么制作公司自己网站店铺设计软件手机版
  • 深圳网站关键词优化公司哪家好怎么选择锦州网站建设
  • 标准网站优势项目合作网站
  • 无人机东莞网站建设wordpress站群管理破解版
  • 深圳企业官网网站建设教育培训学校
  • 医疗网站建设及优化西安网站建设开发公司
  • 网站建设详细流程ydg wordpress theme