Linux计划任务(crontab)
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 1月 20 17:49 cron
-rw-------. 1 root root 17313 1月 2 11:34 cron-20250102
-rw-------. 1 root root 26107 1月 13 11:24 cron-20250113
-rw-------. 1 root root 5242 1月 20 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)!