💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
## 定时任务 >[success]linux中使用crontab命令来实现定时任务的 crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。 cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。 crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。 ### 特点 #### 1. crontab文件一般位于/etc/下,这里面存放系统运行的的调度程序。 #### 2. 每个用户都会生成一个自动生成一个自己的crontab文件,一般位于/var/spool/cron目录下 #### 3. cron.deny 与 cron.allow文件 >[success]/etc/cron.deny 表示不能使用crontab 命令的用户 /etc/cron.allow 表示能使用crontab的用户。 默认情况下,cron.allow文件不存在。如果两个文件同时存在,那么/etc/cron.allow 优先。如果两个文件都不存在,那么只有超级用户可以安排作业。 ### crontab的用法 #### 1. 查看当前用户的定时任务 ~~~ shell>crontab -l #显示结果 * * * * * /home/oracle/test.sh >/dev/null 2>&1 ~~~ #### 2.编辑当前用户的定时任务 >[success]可以在编辑状态修改、删除、新增一些定时任务。注释一般用# ~~~ shell>crontab -e ~~~ #### 3.删除当前用户的定时任务 ~~~ shell>crontab -r ~~~ ### 定时任务的格式 定时任务的格式如下: ~~~ # 23 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1 * * * * * 命令或脚本 ~~~ #### 一条定时任务有 6 列组成,每列的含义如下: crontab 文件中每个条目中各个域的意义和格式: 第一列 分钟: 1——59 第二列 小时: 1——23(0表示子夜) 第三列 日 : 1——31 第四列 月 : 1——12 第五列 星期: 星期0——6(0表示星期天,1表示星期一、以此类推) 第六列 要运行的命令 ### 扩展 >[success]在这里先介绍一个命令watch,以周期性的方式执行给定的指令,指令输出以全屏方式显示。watch可以帮你监测一个命令的运行结果。 #### 命令格式: ~~~ watch(选项)(参数) ~~~ #### 选项: ~~~ -n:指定指令执行的间隔时间(秒)默认2秒; -d:高亮显示指令输出信息不同之处; -t:不显示标题。 ~~~ #### 参数: ~~~ 指令:需要周期性执行的指令。 ~~~ #### watch实例 ~~~ #watch uptime #watch -t uptime #watch -d -n 1 netstat -ntlp #watch -d 'ls -l | fgrep goface' //监测goface的文件 #watch -t -differences=cumulative uptime #watch -n 60 from //监控mail #watch -n 1 "df -i;df" //监测磁盘inode和block数目变化情况 #watch cat /tmp/1.txt //监测1.txt的内容 ~~~ #### 实列 ~~~ 5 * * * * ls # 指定每小时的第5分钟执行一次ls命令 30 5 * * * ls #指定每天的 5:30 执行ls命令 30 7 8 * * ls # 指定每月8号的7:30分执行ls命令 30 5 8 6 * ls #指定每年的6月8日5:30执行ls命令 30 6 * * 0 ls #指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1, 以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。] 30 3 10,20 * * ls #每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段] 25 8-11 * * * ls # 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段] */15 * * * * ls # 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ] 30 6 */10 * * ls # 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ] #每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件 50 7 * * * root run-parts /etc/cron.daily # [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ] ~~~ #### 定时的应用 >前面咱们写了服务器健康状态脚本、磁盘报警脚本、数据库备份脚本。 接下来,就配合定时任务来实现系统监测和数据库的定时备份。 #### 在这里事先把需要加入定时任务的脚本,放到/mybash 目录中 #### 添加如下定时任务 1. 每天上午9点,执行服务器健康态脚本 2. 每周5凌晨3点执行数据库备份脚本 3. 每30分种执行一次磁盘报警脚本 ~~~ shell>crontab -e # 每天上午9点,执行服务器健康态脚本 0 9 * * * /mybash/status.sh # 每周5凌晨3点执行数据库备份脚本 0 3 * * 5 /mybash/mysql.sh # 每30分种执行一次磁盘报警脚本 */30 * * * 0 /mybash/bj.sh ~~~ ### 遇到的问题 1. 脚本通过命令可以执行,但是加入定时任务后,无法正常运行 >[info]这个是因为环境变量的问题,因为在定时任务中环境变量没有生效。通常情况下是因为iptables和ifconfig等命令造成的。 ### 解决办法: #### 方法1: >[success]直接在脚本中加入命令的全路径,如果不清楚命令的路径可以通过whereis命令查看 ~~~ whereis iptables iptables: /sbin/iptables /usr/share/man/man8/iptables.8.gz ~~~ #### 方法2:在脚本中,设置环境变量 >[success]你可以通过脚本设置,也可以通过引入环境变量配置文件的方式。 ~~~ #!/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin //在脚本中加入这一句 iptables -A INPUT -p UDP --dport 123 -j ACCEPT iptables -A OUTPUT -p UDP --sport 123 -j ACCEPT ~~~ 或者使用下面的方式引入环境变量 ~~~ #!/bin/bash . /etc/profile # 前面的`点`不能少,其后要有一个空格 iptables -A INPUT -p UDP --dport 123 -j ACCEPT iptables -A OUTPUT -p UDP --sport 123 -j ACCEPT ~~~ #### 方法3: >[success]在编写定时任务时,设定环境变量 ~~~ crontab -e # 开始编辑定时任务 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin # 这句是关键 * * * * * /root/mysql.sh ~~~