2023_Spark_实验二十七:Linux中Crontab(定时任务)命令详解及使用教程

Crontab介绍:

Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。

实验目的:通过crontab模拟调用实时点击流数据生成脚本,模拟实时数据生成,支持后续实验

实验方法:通过crontab+shell脚本模拟实时数据产生。

实验步骤:

1.使用yum命令安装Crontab:

bash 复制代码
[lh@master real-timeData]$ sudo yum install vixie-cron
[lh@master real-timeData]$ sudo yum install crontabs

2.查看Crontab状态:

bash 复制代码
# 查看crond状态
[lh@master real-timeData]$ service crond status

# 或者
[lh@master real-timeData]$ systemctl status crond


# 检查其是否自启  # centos7
[lh@master real-timeData]$ systemctl is-enabled crond
 
# centos6.x
[lh@master real-timeData]$ chkconfig --list crond

3.添加定时任务:

bash 复制代码
cd /home/lh/scripts/real-timeData/
mkdir logs
crontab -e

# 配置模拟实时数据产生的代码定时运行
1 * * * * /home/lh/scripts/real-timeData/real-time-producer.sh >> /home/lh/scripts/real-timeData/logs/`date +%Y%m%d`.log

4.查看任务列表:

bash 复制代码
[lh@master real-timeData]$ crontab -l

5.Crontab相关命令:

(1)语  法:

crontab -u \<用户名称\>配置文件 或 crontab { -l | -r | -e }-u #<用户名称> 是指设定指定<用户名称>的定时任务,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的定时任务。-l  #列出该用户的定时任务设置。-r  #删除该用户的定时任务设置。-e  #编辑该用户的定时任务设置。

(2)命令时间格式 :

* *   *  *  *  command

分  时  日  月  周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示

第2列表示小时1~23(0表示0点)

第3列表示日期1~31

第4列表示月份1~12

第5列标识号星期0~6(0表示星期天)

第6列要运行的命令

(3)一些Crontab定时任务例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每晚的21:30 重启apache

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月1、10、22日的4 : 45重启apache

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart #每周六、周日的1 : 10重启apache

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart #每天18 : 00至23 : 00之间每隔30分钟重启apache

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart #每星期六的11 : 00 pm重启apache* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart #晚上11点到早上7点之间,每隔一小时重启apache* */1 * * * /usr/local/etc/rc.d/lighttpd restart #每一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart #每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart #一月一号的4点重启apache

*/30 * * * * /usr/sbin/ntpdate cn.pool.ntp.org #每半小时同步一下时间

0 */2 * * * /sbin/service httpd restart #每两个小时重启一次apache

50 7 * * * /sbin/service sshd start #每天7:50开启ssh服务

50 22 * * * /sbin/service sshd stop #每天22:50关闭ssh服务

0 0 1,15 * * fsck /home #每月1号和15号检查/home 磁盘

1 * * * * /home/bruce/backup #每小时的第一分执行 /home/bruce/backup这个文件

00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; #每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

30 6 */10 * * ls #每月的1、11、21、31日是的6:30执行一次ls命令

6.部分脚本无法执行问题:

如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:

(1)所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。

(2)在 shell 脚本开头使用以下代码:

#!/bin/sh

/etc/profile

~/.bash_profile

(3)在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:

20 03 * * * . /etc/profile;/bin/sh /var/www/wwwroot/test.sh

7.Crontab默认调度任务:

cron默认配置了调度任务,分别为:hourly、daily、weekly、mouthly,默认配置文件为/etc/anacrontab

将需要执行的脚本放到相应的目录下即可,目录分别为:

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/ect/cron.mouthly

8.注意清理系统用户的邮件日志:

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

"/dev/null 2>&1"表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

9.Crontab日志路径:

ll /var/log/cron* #/var/log/cron只会记录是否执行了某些计划的脚本,但是具体执行是否正确以及脚本执行过程中的一些信息则linux会每次都发邮件到该用户下。

10.Crontab命令在线验证工具:

crontab执行时间计算 - 在线工具 (tool.lu)

定时任务最快为每分钟调度一次,因为我们要摸底用户的搜索点击数据,以分钟为单位明显达不到要求,后期的spark streaming处理是以秒为单位的,明显不符合要求,需要手动改造为每五秒生成一次数据

11. 改造步骤3添加定时任务

bash 复制代码
# 配置模拟实时数据产生的代码定时运行
1 * * * * for i in {1..12}; do /home/lh/scripts/real-timeData/real-time-producer.sh >> /home/lh/scripts/real-timeData/logs/real-time-data.log; sleep 5; done

(1)将1分钟拆分成12等分(等同于每5秒执行一次)

(2)执行sh脚本,">>"表示将输出追加到对应的日志文件中,

(3)sleep 5,休眠5秒,这样就相当于5秒执行一次

实验结果:

查看日志文件如下

bash 复制代码
[lh@master logs]$ cat real-time-data.log

查看crontab运行日志如下

bash 复制代码
sudo cat /var/log/cron

实验结论:

通过crontab+shell脚本可以实现模拟实时数据产生,得到每5秒一条数据记录。

相关推荐
AlfredZhao2 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334668 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪10 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信