自学内容网 自学内容网

Linux计划任务(crontab)

计划任务(crontab)

计划任务(crontab)是指在Linux系统中,利用cron(crond)这个系统服务来控制的定时执行工具,它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。
Crontab是cron table的缩写,其中cron是Unix系统中的一个后台进程,用于执行预定的任务。Crontab文件包含一系列计划任务条目,每个条目都定义了一个任务的执行时间和要运行的命令或脚本。这些任务可以按照分钟、小时、日、月和星期等不同的时间单位进行安排。

[root@localhost logs]# 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

周期性任务计划 cron

cron 依赖于 crond 服务,确保 crond 守护处于运行状态:

#CentOS 7 以后版本
systemctl status crond

#CentOS 6 版本
service crond status

系统cron任务

cron任务分为系统级任务和用户级任务

操作系统自带的cron 任务,系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件
系统cron任务是操作系统自己调用的任务,与用户无关如果想添加系统级的cron任务,写在此文件中。/etc/crontab。
系统cron任务相关文件

/etc/crontab #配置文件
/etc/cron.d/ #配置文件
/etc/cron.hourly/ #脚本
/etc/cron.daily/ #脚本
/etc/cron.weekly/ #脚本
/etc/cron.monthly/ #脚本

用户cron任务

每个用户自己名下的 cron 任务
红帽系统保存在 /var/spool/cron/USERNAME,
Ubuntu 系统存放在/var/spool/cron/crontabs/USERNAME,利用 crontab 命令管理

cron 程序日志文件

ll /var/log/ | grep cron

cron 时间表示法

字段可以是星号(*),表示该字段的每个值都有效;也可以是具体的数值,表示仅在该值时才有效;还可以是逗号分隔的列表,表示列表中的每个值都有效;以及连字符表示的范围,例如 10-12 表示小时 10、11、12。

注意:crontab定时任务支持的最小单位是分钟级,即最小周期为每分钟执行一次,如果需要更小的粒度(如秒级),请使用其他方法实现。

# * 表示该位置上所有可以出现的值
* * * * *  #每分钟执行一次
1 2 * * *  #每天2时1分执行一次

# , 表示该位置上多个值
1,3,5 2,4,6 * * *  #表示第2,4,6这三个小时中每个小时的第1,3,5分的时候执行一次

# - 表示范围取值
1-5 2-6 * * *  #表示第2到第6小时,第时的第1到第5分每分钟执行一次

# / 表示频率,步长
*/5 * * * *  #每5分钟执行一次
* */5 * * *  #每5小时执行一次

# 综合用法
*/5 1,3,5-8 * * 2,4  #每周2和每周4的第1时,第3时,第5到8时,每5分钟执行一次 
1 2 1-10 * 1-5  #每月的1到10日,或每周1到周五的2时1分执行一次
1-30/5 * * * *  #每小时1-30分内,每5分钟执行一次

#一些示例
*/5 * * * *  #每五分钟执行
0 * * * *    #每小时执行 
0 0 * * *    #每天执行   
0 0 * * 0    #每周执行   
0 0 1 * *    #每月执行   
0 0 1 1 *    #每年执行   

#特定关健字
@yearly  #每年1月1日执行一次,相当于 0 0 1 1 *
@annually  #每年1月1日执行一次,相当于 0 0 1 1 *
@monthly  #每月1日执行一次,相当于 0 0 1 * *
@weekly  #每周日执行一次,相当于 0 0 * * 0
@daily  #每天0时执行一次,相当于 0 0 * * *
@hourly  #每小时0分执行一次,相当于 0 * * * *
@reboot  #重启后执行一次

示例

创建cron任务

语法

[cron时间表达式] [user](指定哪个用户来执行定时任务(可忽略)) [command(要执行的命令或脚本)]

输入 crontab -e 命令,按 i 键进入编辑模式,然后输入下面的脚本。输入完成之后保存退出。

*/2 * * * * /data/wan/logs/asd.sh

这个脚本的意思是,2分钟执行一次asd.sh。

输入 crontab -l 命令,可以看到当前用户下的所有定时任务。-e指令表示进入可编辑状态。

[root@localhost logs]# cat asd.sh 
date_str=$(date +%Y-%m-%d_%H-%M-%S)
cp /data/wan/logs/wae.txt /data/wan/logs/wae_${date_str}.txt.bak
echo ${date_str}" cp finish..."

cron 任务中的标准输入输出会发送邮件到用户邮箱,对应文件是: /var/spool/mail/root。 如果想将提示写在其他文件,则可以在定时任务中加上重定向。
将脚本的输出内容写入到文件,log.log。如果不存在就创建一个。若当前任务是root用户,则日志路径是/root/log.log。若任务是hdfs用户,则日志路径是/hdfs/log.log。

*/2 * * * * /data/wan/logs/asd.sh >> log.log
*/2 * * * * /data/wan/logs/asd.sh >> ./log.log

如果要创建在其他目录,写个绝对路径就行。

*/2 * * * * /data/wan/logs/asd.sh >> /data/log.log

查看cron任务

在终端输入 crontab -l 指令,就能查看当前用户下,在执行的定时任务。
若当前是root用户, crontab -l 相当于 cat /var/spool/cron/root。 同样的,若当前是hdfs用户, crontab -l 相当于 cat /var/spool/cron/hdfs。
所以 crontab -e 相当于 vim /var/spool/cron/root。 crontab -r 相当于 rm -f /var/spool/cron/root。 crontab -ir 相当于 rm /var/spool/cron/root。

如果不想永久删除也可以在定时任务前添加 # 注释掉该任务即可,添加注释的定时任务会被忽略。

查看执行日志

cat /var/log/cron

还有其他日期结尾的日志。

[root@localhost log]# ll | grep cron
-rw-------. 1 root   root     10691 120 17:49 cron
-rw-------. 1 root   root     17313 12 11:34 cron-20250102
-rw-------. 1 root   root     26107 113 11:24 cron-20250113
-rw-------. 1 root   root      5242 120 12:25 cron-20250120

crontab命令

  • 每个用户都有专用的cron任务文件:/var/spool/cron/crontabs/USERNAME
  • 默认标准输出和错误会被发邮件给对应的用户,如:hdfs用户创建的任务就发送至hdfs的邮箱
  • root能够修改其它用户的作业
  • 用户的cron中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path或者加入到计划任务执行的脚本中
  • 第六个字段指定要运行的命令。该行的整个命令部分,直至换行符或“%”字符,指定的shell执行,除非使用反斜杠(\)进行转义,否则该命令中的“%”字符将变为换行符,并且第一个%之后的所有数据将作为标准输入发送到该命令
crontab [-u user] [-l | -r | -e] [-i]

#常用选项
-l #列出所有任务
-e #编辑任务
-r #移除所有任务
-i #同-r一同使用,以交互式模式移除指定任务
-u user #管理特定用户的cron,仅root有权限操作

环境变量问题

有时我们创建了一个 crontab ,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在 crontab文件中没有配置环境变量引起的。

在 crontab 文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前 shell 环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在 crontab 文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
cron 不知道所需要的特殊环境。所以要保证在 shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下4点:

# 脚本中涉及文件路径时写全局路径;

# 检查用户是否有执行脚本的权限

# 脚本执行要用到java或其他环境变量时,通过 `source` 命令引入环境变量,如:
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &

#  当手动执行脚本OK,但是 `crontab` 死活不执行时。这时可能是环境变量惹的祸,并可以尝试在 `crontab`中直接引入环境变量解决问题。
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

其他

如果任务创建后,没有成功执行,可以看看crond服务状态 service crond status

service crond start #启动服务
service crond stop #关闭服务
service crond restart #重启服务
service crond reload #重新载入配置

原文地址:https://blog.csdn.net/qq_55342245/article/details/144891369

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!