其实大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本呢?这就要借助Linux的cron功能了。这部分内容很重要,请大家牢记!
![Linux操作系统任务计划详解 图片[1]-Linux操作系统任务计划详解-不念博客](https://www.bunian.cn/wp-content/uploads/2023/01/image-97.png)
命令crontab
Linux任务计划功能的操作都是通过crontab命令来完成的,其常用的选项有以下几个。
- -u:表示指定某个用户,不加-u选项则为当前用户。
- -e:表示制定计划任务。
- -l:表示列出计划任务。
- -r:表示删除计划任务。
下面请跟着阿铭来创建第一个任务计划,如下所示:
# crontab -eno crontab for root - using an empty one# crontab -e no crontab for root - using an empty one# crontab -e no crontab for root - using an empty one
这里使用crontab -e来编写任务计划,这实际上是使用vim工具打开了crontab的配置文件,我们写下如下内容:
01 10 05 06 3 echo "ok" > /root/cron.log01 10 05 06 3 echo "ok" > /root/cron.log01 10 05 06 3 echo "ok" > /root/cron.log
这里每个字段的数字分别表示什么呢?从左到右依次为:分、时、日、月、周和命令行。上例表示在6月5日(这一天必须是星期三)的10点01分执行命令:
echo "ok" > /root/cron.log。echo "ok" > /root/cron.log。echo "ok" > /root/cron.log。
命令crontab -e实际上是打开了/var/spool/cron/username文件(如果用户是root,则打开的是/var/spool/cron/root)。打开这个文件使用了vim编辑器,所以保存时在命令行模式下输入:wq即可。但是请千万不要直接去编辑那个文件,否则会出错,所以一定要使用命令crontab -e来编辑。
查看已经设定的任务计划使用crontab -l命令,如下所示:
# crontab -l01 10 05 06 3 echo "ok" > /root/cron.log# crontab -l 01 10 05 06 3 echo "ok" > /root/cron.log# crontab -l 01 10 05 06 3 echo "ok" > /root/cron.log
删除任务计划要使用crontab -r命令,这个删除选项最好还是少用,因为它会一下子把全部计划都删除掉。如果你想只删除一条计划,可以使用-e选项进入crontab进行编辑。-r选项用法如下所示:
# crontab -r# crontab -lno crontab for root# crontab -r # crontab -l no crontab for root# crontab -r # crontab -l no crontab for root
cron练习题
Cron的内容不算太难,但需要你牢固掌握。下面阿铭给出一些练习题,帮助你熟悉cron的应用。
- 每天凌晨1点20分清除/var/log/slow.log这个文件。
- 每周日3点执行/bin/sh /usr/local/sbin/backup.sh。
- 每月14日4点10分执行/bin/sh /usr/local/sbin/backup_month.sh。
- 每隔8小时执行ntpdate time.windows.com。
- 每天的1点、12点和18点执行/bin/sh /usr/local/sbin/test.sh。
- 每天的9点到18点执行/bin/sh /usr/local/sbin/test2.sh。
下面是以上习题的答案,仅作参考。
20 1 * * * echo "" >/var/log/slow.log0 3 * * 0 /bin/sh /usr/local/sbin/backup.sh10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh0 */8 * * * ntpdate time.windows.com0 1,12,18 * * * /bin/sh /usr/local/sbin/test.sh0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh20 1 * * * echo "" >/var/log/slow.log 0 3 * * 0 /bin/sh /usr/local/sbin/backup.sh 10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh 0 */8 * * * ntpdate time.windows.com 0 1,12,18 * * * /bin/sh /usr/local/sbin/test.sh 0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh20 1 * * * echo "" >/var/log/slow.log 0 3 * * 0 /bin/sh /usr/local/sbin/backup.sh 10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh 0 */8 * * * ntpdate time.windows.com 0 1,12,18 * * * /bin/sh /usr/local/sbin/test.sh 0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh
练习完上面的题目,你可能会有一些小疑问。这里要简单说明一下,每隔8小时就是用全部小时(0~23)去除以8,结果算出来应该是0、8和16这3个数。当遇到多个数(分钟、小时、月、周)时,则需要用逗号隔开,比如第5题中的1,12,18。时间段是可以用n-m的方式表示的,比如第6题中的9-18。
设置好了所有的任务计划后,我们需要查看一下crond服务是否已经启动,如下所示:
# systemctl status crond● crond.service - Command SchedulerLoaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)Active: active (running) since Fri 2020-06-26 15:41:17 CST; 1h 22min agoMain PID: 820 (crond)Tasks: 1 (limit: 11353)Memory: 1.9MCGroup: /system.slice/crond.service└─820 /usr/sbin/crond -n6月 26 15:41:17 aminglinux-123 systemd[1]: Started Command Scheduler.6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) STARTUP (1.5.2)6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (Syslog will be used instead of sendmail.)6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (running with inotify support)6月 26 16:01:01 aminglinux-123 CROND[2042]: (root) CMD (run-parts /etc/cron.hourly)6月 26 17:01:01 aminglinux-123 CROND[4032]: (root) CMD (run-parts /etc/cron.hourly)# systemctl status crond ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-26 15:41:17 CST; 1h 22min ago Main PID: 820 (crond) Tasks: 1 (limit: 11353) Memory: 1.9M CGroup: /system.slice/crond.service └─820 /usr/sbin/crond -n 6月 26 15:41:17 aminglinux-123 systemd[1]: Started Command Scheduler. 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) STARTUP (1.5.2) 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (Syslog will be used instead of sendmail.) 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.) 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (running with inotify support) 6月 26 16:01:01 aminglinux-123 CROND[2042]: (root) CMD (run-parts /etc/cron.hourly) 6月 26 17:01:01 aminglinux-123 CROND[4032]: (root) CMD (run-parts /etc/cron.hourly)# systemctl status crond ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-26 15:41:17 CST; 1h 22min ago Main PID: 820 (crond) Tasks: 1 (limit: 11353) Memory: 1.9M CGroup: /system.slice/crond.service └─820 /usr/sbin/crond -n 6月 26 15:41:17 aminglinux-123 systemd[1]: Started Command Scheduler. 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) STARTUP (1.5.2) 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (Syslog will be used instead of sendmail.) 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.) 6月 26 15:41:17 aminglinux-123 crond[820]: (CRON) INFO (running with inotify support) 6月 26 16:01:01 aminglinux-123 CROND[2042]: (root) CMD (run-parts /etc/cron.hourly) 6月 26 17:01:01 aminglinux-123 CROND[4032]: (root) CMD (run-parts /etc/cron.hourly)
看Active那行,如果是启动状态显示为active(running),未启动则显示为inactive (dead)。