Linux定时服务 crond

本文详细介绍了Linux中的crond服务,用于定期执行程序。crond每分钟检查是否有待执行任务,并自动执行。它管理两类任务:系统任务(如日志轮询、数据备份)和用户任务(如时间同步、邮件检查)。文章讲解了crond的配置文件、相关目录、定时任务的编写规范以及如何通过crontab命令进行管理。同时,提到了crond的启动状态检查、日志查看以及排查任务问题的方法,并给出了编写定时任务的注意事项,如使用绝对路径、避免屏幕输出等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用:

crond 是linux用来定期执行程序的命令。安装完成操作系统后,默认启动此任务调度命令

crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作

 

linux系统定时任务调度工作主要分为两类:

系统执行的工作 -- 系统周期性执行的任务,如轮询系统日志,备份系统数据,清理系统缓存等

[root@root ~]#ll /var/log/messages* 
-rw------- 1 root root 149 Feb 21 15:11 /var/log/messages 
-rw-------. 1 root root 941651 Jan 31 16:33 /var/log/messages-20210131 
-rw------- 1 root root 578536 Feb 14 13:32 /var/log/messages-20210214 
-rw------- 1 root root 434135 Feb 21 14:04 /var/log/messages-20210221

用户执行的工作 -- 用户定期要做的工作,如每隔5分钟和互联网上时间服务器进行时间同步,每隔10分钟检查邮件服务器是否有新信。这些工作由用户自行设置

 

相同软件种类:

  • cronie 实现定时任务功能
  • atd 实现定时任务功能 只能一次设置定时功能
  • anacron 实现定时任务功能 常应用在家用电脑 非7*24服务器

 

Linux crond定时任务软件包

#使用yum provides crond or yum provides crondtab 查看定时任务命令属于哪个软件工具包
[root@root  ~]#yum provides crontab 
#如果没有搜索到工具包名 使用 */crontab or *bin/crontab
[root@root  ~]#yum provides */crontab
#还是没有搜索成功 建议优化yum源并扩展yum源

#根据搜索的包名 检查是否安装cronie软件
[root@root ~]# rpm -qa cronie
cronie-1.4.4-16.el6_8.2.i686

#查看软件包中的所有文件信息
[root@root ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron

 

常用相关配置文件介绍(有的目录属于系统有的目录属于cronie软件包中):

/var/spool/cron/         目录下存放的是每个用户包括root的crontab任务配置文件,每个配置文件以创建用户名字命令

/etc/crontab               这个文件负责调度各种管理和维护任务

/etc/cron.d/                这个目录用来存放任何要执行的crontab文件或脚本

/etc/cron.deny            crontab限制用户权限,不可以使用crontab的用户写入其中。未写入的用户可以使用crontab

/etc/cron.allow           crontab限制用户权限,可以使用crontab的用户写入其中。未写入的用户不可以使用crontab

ps: cron.deny和cron.allow 都存在时 忽略cron.deny的内容 cron.allow文件权限大于cron.deny

 

系统定时任务周期:每小时 控制定时任务目录:/etc/cron.hourly

系统定时任务周期:每一天 控制定时任务目录:/etc/cron.daily 00:00-23:59

系统定时任务周期:每一周 控制定时任务目录:/etc/cron.weekly 7天

系统定时任务周期:每个月 控制定时任务目录:/etc/cron.monthly 30 28 31

 

定时任务crond支持两种实现方式:

1. 直接编写计划任务

2. 使用目录的方式,放在指定的目录都会定时执行

 

crontab命令及参数:

crontab [-u user] file

crontab [-u user] [-l | -r | -e] [-i] [-s]

常用参数:

-l 查看crontab文件内容

-e 编辑crontab文件内容

-r 移出所有crontab文件内容(如果只删除某个,用-e编辑即可)

-i 配合-r参数使用,在移出所有crontab文件内前提示是否删除

提示:

1. crontab{-l | -e}实际上就是在操作/var/spool/cron/当前用户这样的文件

2. 在crontab命令中只有"绝对路径",不存在相对路径,执行任何命令都需要写绝对路径 (which 命令 -- 查看命令绝对路径)

 

定时任务直接编辑

crontab -e

#执行命令后直接进入vi编辑界面 每一行都是单独一项工作

 

编写语法规范:

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

# For details see man 4 crontabs

# 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) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

 

crontab基本格式

* * * * * cmd

分 时 日 月 周 需要执行的命令

代表意义

分钟

小时

日期

月份

命令

数字范围

0~59

0~23

1~31

1~12

0~7

需要执行的命令

周 -- 0或7都代表"星期天"的意思。

 

特殊字符

代表含义

*

星号代表任何时刻,就是“每”的意识。取值范围所有数字

举例: 00 01 * * * cmd 表示每天的01点执行命令

,

逗号代表分割时段。

举例: 30 09,10 * * * cmd 表示每天的9点30分和10点分执行命令

-

减号代表一个时间范围段。

举例: 20 09-12 * * * cmd 表示每天的9点到12点的20分(9点20|10点20|11点20|12点20)执行命令

/n

n代表数字范围内的数字,即每隔n单位间隔的意识,例如每隔15分钟:*/15 * * * * cmd

举例: 15 */3 * * * cmd 表示每隔3小时的15分钟执行命令

 

实践应用:

#查看crond是否开启及开机自启动
#centos6
[root@root ~]#service crond status
crond (pid  1038) is running...
[root@centos6-003 ~]#chkconfig --list
abrt-ccpp      	0:off	1:off	2:off	3:on	4:off	5:on	6:off
abrtd          	0:off	1:off	2:off	3:on	4:off	5:on	6:off
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off

#centos7
systemctl status crond

#查看定时任务
[root@centos6-003 ~]#crontab -l
#每两分钟执行一次echo命令 
*/2 * * * * echo "crontad定时任务执行"

#通过日志或邮件信息查看定时任务是否执行
[root@root ~]#tail -5 /var/log/cron
Feb 21 19:42:01 centos6-003 CROND[2162]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:44:01 centos6-003 CROND[2169]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:46:01 centos6-003 CROND[2176]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:48:01 centos6-003 CROND[2183]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:50:01 centos6-003 CROND[2191]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")

[root@root ~]#tail -10 /var/spool/mail/root
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20210221115201.D5AADC1467@root.localdomain>
Date: Sun, 21 Feb 2021 19:52:01 +0800 (HKT)

crontad定时任务执行

#crontad定时任务正常执行后创建一个脚本再进行测试
[root@root ~]#cat /tmp/crondTest.sh 
#!/bin/bash
touch crondTest_`date +%F-%H-%M`.txt

#编写定时任务
[root@root ~]#crontab -e
#查看编写的定时任务
[root@root ~]#crontab -l
#每两分钟执行一次echo命令 
*/2 * * * * echo "crontad定时任务执行"
#每隔一分钟执行crondTest.sh
*/3 * * * * /bin/sh /tmp/crondTest.sh
#通过日志和邮件查看是否执行
*/3 * * * * echo "crontad定时任务执行"

 

定时任务排查方法:

#检查定时任务配置文件是否存在
[root@root ~]#cat /var/spool/cron/root 
#每两分钟执行一次echo命令 
*/2 * * * * echo "crontad定时任务执行"
#每隔一分钟执行crondTest.sh
*/3 * * * * /bin/sh /tmp/crondTest.sh

#查看定时任务日志文件
[root@root ~]#tail -3 /var/log/cron
Feb 21 20:18:01 root   CROND[2409]:   (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 20:20:02 root   CROND[2420]:   (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 20:21:01 root   CROND[2427]:   (root) CMD (/bin/sh /tmp/crondTest.sh)
执行时间         主机名 定时任务执行PID  用户名     执行命令

#打印信息到屏幕上的定时任务可以查看邮件
[root@root ~]#tail -5 /var/spool/mail/root 
Message-Id: <20210221122801.BBF4BC1467@root.localdomain>
Date: Sun, 21 Feb 2021 20:28:01 +0800 (HKT)

crontad定时任务执行

 

编写定时任务的注意事项:

1) 编写定时任务要有注释说明

2) 定时任务命令或程序写到脚本里执行

3) 命令和文件使用绝对路径

4) 编写定时任务,结尾加 > /dev/null 2>&1 可以将输出到屏幕上的信息保存到黑洞中,避免占用磁盘空间

5) 指定用户下执行相关定时任务

6) 生产任务程序尽量不要产生屏幕输出信息

注: 定时任务中执行命令,如果产生输出到屏幕的信息,都会以邮件方式告知用户

/var/spool/mail/root 不断变大占用磁盘空间 占用的block空间

解决方法: 将邮件服务关闭

centos6: service postfix stop

centos7: systemctl stop postfix

/var/spool/postfix/maildrop/ 不断产生小文件占用磁盘空间 占用的inode空间

解决方法: 删除小文件

rm -f /var/spool/postfix/maildrop/*

systemctl start postfix

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值