Linux Crond服务

Linux Crond服务

标题内容
crond定义,作用,特点
crond配置参数说明
crondcrontab命令方法
crondcrond服务的注意事项

crond定义,作用,特点

crond定义与作用

  • Linux系统定时任务是由cron(crond)系统服务来控制的。服务如下:
[root@cess-master01 ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2022-10-17 10:24:03 CST; 5 days ago
 Main PID: 14999 (crond)
    Tasks: 1
   Memory: 7.3M
   CGroup: /system.slice/crond.service
           └─14999 /usr/sbin/crond -n

Oct 17 10:24:03 cess-master01 systemd[1]: Started Command Scheduler.
Oct 17 10:24:03 cess-master01 systemd[1]: Starting Command Scheduler...
Oct 17 10:24:03 cess-master01 crond[14999]: (CRON) INFO (Syslog will be used instead of sendmail.)
Oct 17 10:24:03 cess-master01 crond[14999]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 1% if used.)
Oct 17 10:24:03 cess-master01 crond[14999]: (CRON) INFO (running with inotify support)
Oct 17 10:24:03 cess-master01 crond[14999]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
[root@cess-master01 ~]# cat /usr/lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target

[Service]
EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process

[Install]
WantedBy=multi-user.target

[root@cess-master01 ~]#

注意: /usr/lib/systemd/system是系统服务,而/etc/systemd/system是用户服务,一般我们自己维护的服务都放在/etc/systemd/system目录下不与系统服务产生冲突。

  • Linux系统上面原本就有非常多的计划性工作,所以crond系统服务本身默认是启动的。
  • 当然了,如果我们自己需要设置定时计划任务,我们可以使用crontab命令去设置定时计划任务。下面看下crontab命令的操作以及操作之后crond配置变化。

crond特点

  • crond是Linux下用来周期性的执行某个任务或者等待处理某些事件的一个守护进程,与Windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务
  • 但是任务调度的形式有可以分为两种,一种是系统任务调度,另一种是用户任务调度。我们在下面配置方式中会详细介绍。

配置crond

  • 我们已经知道crond的任务调度类型有两种,系统任务调度用户任务调度,我们先来说说系统任务调度

系统任务调度

  • 实际上crond的服务可以追溯到UNIX系统上,Linux是从UNIX演进而来的(这里crond服务指的Linux系统上的crond服务),所以Linux系统周期性所要执行的工作,比如说Cache中的数据写入硬盘,日志清理等都是系统周期性所要执行的任务
  • 系统周期性所要执行的任务配置是在/etc/crontab文件中,如下所示:
[root@cess-master01 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 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

[root@cess-master01 ~]#
  • 以上是默认的配置,前三行是用来配置crond任务运行的环境变量,默认配置解释:
  • 第一行SHELL=/bin/bash变量指定了系统要使用哪个SHELL COMMAND,默认都是bash
  • 第二行PATH变量指定了系统执行命令的路径;
  • 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。
[root@cess-master01 ~]# 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
59 * * * * root scrapy crawl mygirl

[root@cess-master01 ~]#
  • 第四行HOME/变量指定了在执行命令或者脚本时使用的主目录。如果不填写crontab的默认执行路径为当前用户的根路径。比如:
[root@VM-64-144-centos ~]# cd ~
[root@VM-64-144-centos ~]# pwd
/root
[root@VM-64-144-centos ~]

用户任务调度

  • 用户定期要执行的任务工作,比如数据库数据备份、定时邮件提醒等。用户自己可以使用crontab工具来定制自己的计划任务。所用用户定义的crontab文件都被保存在/var/spool/cron目录中。如下:
[root@VM-64-144-centos ~]# cat /var/spool/cron/root
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
20 */1 * * * sh /usr/share/nginx/fallback/fallback_copy.sh > /usr/share/nginx/fallback/fallback_copy.log
[root@VM-64-144-centos ~]#
  • /etc/cron.deny文件,这个文件中所列用户不允许使用crontab命令;
  • /etc/cron.allow文件,这个文件中所列用户允许使用crontab命令;
  • /var/spool/cron/文件,所有用户crontab文件存放的目录,以用户名命名。

# 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
59 * * * * root scrapy crawl mygirl
  • 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式分为六个字段,前五段是时间设定段,第六段诗任务调度用户设定段,第七段是要执行的命令段。格式如下:
minute hour day month week user-name command
  • 其中:

  • minute: 表示分钟,可以是从0到59之间的任何整数;

  • hour: 表示小时,可以是从0到23之间的任何整数;

  • day: 表示日期,可以是从1到31之间的任何整数;

  • month: 表示月份,可以是从1到12之间的任何整数;

  • week: 表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日;

  • user-name: 指定某个用户有权限执行command命令,默认是root用户;

  • command: 要执行命令,可以是系统命令,也可以是自己编写的脚本文件。

  • 在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*): 代表所有可能的值,例如minute字段如果是星号,则表示在满足其它字段的制约条件后每分钟都执行该命令操作。

  • 逗号(,): 可以用逗号隔开的值指定一个列表范围,例如: "1,2,5,7,8,9"

  • 中杠(-): 可以用整数之间的中杠表示一个整数范围,例如: "2-6"表示"2,3,4,5,6"。

  • 正斜线(/): 可以用正斜线指定时间的时间频率,例如: "0-23/2"表示每两小时执行一次。同时正斜线可以和星号一起使用,例如: */10, 如果用在minute字段,表示每十分钟执行一次

  • 以上就是crontab配置参数的说明,可以详细参考使用。

  • 实例:

# 每隔1分钟执行一次command
* * * * * user-name command

# 每小时的第3和第15分钟执行
3,15 * * * * user-name command

# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * user-name command

# 每隔两天的上午8点到11点的第3和第15分钟执行 
3,15 8-11 */2 * * user-name command

# 每隔星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 user-name command

# 每晚的21:30重启网络
30 21 * * * user-name /etc/init.d/network restart

# 每月1,10,22日的4:50重启network
50 4 1,10,22 * * user-name /etc/init.d/network restart

# 每周六、周日的6:30重启network
30 6 * * 6,0 user-name /etc/init.d/network restart

# 每天18:00至23:00之间每隔30分钟重启network
0,30 18-23 * * * user-name /etc/init.d/network restart

# 每一小时重启network
* */1 * * * user-name /etc/init.d/network restart

# 每隔4个小时重启network
* */4 * * * user-name /etc/init.d/network restart

# 每星期六的晚上23:00重启network
0 23 * * 6 user-name /etc/init.d/network restart

# 晚上11点到早上7点之间,每隔一个小时重启network
* 23-7/1 * * * user-name /etc/init.d/network restart

# 每月的4号与每周一到周三的11点重启network
0 11 4 * mon-wed user-name /etc/init.d/network restart

# 一月一号的4点重启network
0 4 1 jan * user-name /etc/init.d/network restart

# 每小时执行数据库备份到tmp目录的all.sql文件中
01 * * * * user-name(root) mysqldump -uroot -ppwd -all-databases > /tmp/all.sql

crontab命令方法

  • crontab -l list命令列出crontab文件。
[root@VM-64-144-centos ~]# crontab -l
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
20 */1 * * * sh /usr/share/nginx/fallback/fallback_copy.sh > /usr/share/nginx/fallback/fallback_copy.log
[root@VM-64-144-centos ~]#
  • crontab -e edit命令编辑crontab文件,进入到vim编辑器去编辑任务调度。
[root@VM-64-144-centos ~]# crontab -e
crontab: no changes made to crontab
[root@VM-64-144-centos ~]#
  • crontab -r remove命令编辑crontab文件。请确认需要删除之后进行删除。
[root@VM-64-144-centos ~]# crontab -r

  • 如果不小心误删除了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名,如果由于权限问题无法完成拷贝,可以用:
[root@VM-64-144-centos ~]# crontab <filename>

  • 其中,<filename>是你在$HOME目录中副本的文件名。
  • 建议你在自己的$HOME目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r健紧挨在e健的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

注意: 有些crontab的命令有些怪,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这个时候不要delete健退出,不要强制退出<Ctrl+D>,否则你将丢失crontab文件。


crond注意事项