当前位置: 首页 > news >正文

【运维】Linux定时任务 定时执行脚本

【运维】Linux定时任务 定时执行脚本

在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的。crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务。

五分钟执行一次sh脚本

进入编辑页面

crontab -e

按Insert 进行编辑

# 每两分钟执行一次
*/2 * * * * /usr/local/start.sh

依次按 :wq 进行保存 即时生效

重启

service crond restart

#设定crond服务为开机自启动

chkconfig crond on

接下来,在介绍 crontab 命令。该命令和 at 命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:

  • 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。
  • 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。
  • 这个规则基本和 at 命令的规则一致,同样是 /etc/cron.allow 文件比 /etc/cron.deny 文件的优先级高,Linux 系统中默认只有 /etc/cron.deny 文件。


每个用户都可以实现自己的 crontab 定时任务,只需使用这个用户身份执行“crontab -e”命令即可。当然,这个用户不能写入 /etc/cron.deny 文件。

crontab 命令的基本格式如下:

[root@localhost ~]# crontab [选项] [file]

注意,这里的 file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入 crontab。

与此同时,表 1 罗列出了此命令常用的选项及功能。

表 1 crontab 命令常用选项及功能
选项功能
-u user用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo
用户的 crontab 服务,此选项一般有 root 用户来运行。
-e编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i在删除用户的 crontab 文件时,给确认提示。


其实 crontab 定时任务非常简单,只需执行“crontab -e”命令,然后输入想要定时执行的任务即可。不过,当我们执行“crontab -e”命令时,打开的是一个空文件,而且操作方法和 Vim 是一致的。那么,这个文件的格式才是我们真正需要学习的内容。文件格式如下:

[root@localhost !]# crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务

这个文件中是通过 5 个“*”来确定命令或任务的执行时间的,这 5 个“*”的具体含义如表 2 所示。

表 2 crontab 时间表示
项目含义范围
第一个"*"一小时当中的第几分钟(minute)0~59
第二个"*"一天当中的第几小时(hour)0~23
第三个"*"一个月当中的第几天(day)1~31
第四个"*"一年当中的第几个月(month)1~12
第五个"*"一周当中的星期几(week)0~7(0和7都代表星期日)


在时间表示中,还有一些特殊符号需要学习,如表 3 所示。

表 3 时间特殊符号
特殊符号含义
*(星号)代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。
,(逗号)代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠)代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线)代表每隔多久执行一次。比如"*/10****命令",代表每隔 10 分钟就执行一次命令。


当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效,只要 crond 服务是启动的。知道了这 5 个时间字段的含义,我们多举几个时间的例子来熟悉一下时间字段,如表 4 所示。

表 4 crontab举例
时间含义
45 22 ***命令在 22 点 45 分执行命令
0 17 ** 1命令在每周一的 17 点 0 分执行命令
0 5 1,15**命令在每月 1 日和 15 日的凌晨 5 点 0 分执行命令
40 4 ** 1-5命令在每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 ***命令在每天的凌晨 4 点,每隔 10 分钟执行一次命令
0 0 1,15 * 1命令在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆


现在我们已经对这 5 个时间字段非常熟悉了,可是在“执行的任务”字段中都可以写什么呢?既可以定时执行系统命令,也可以定时执行某个 Shell 脚本,这里举几个实际的例子。

【例 1】让系统每隔 5 分钟就向 /tmp/test 文件中写入一行“11”,验证一下系统定时任务是否会执行。

[root@localhost ~]# crontab -e
#进入编辑界面
*/5 * * * * /bin/echo "11" >> /tmp/test

这个任务在时间工作中没有任何意义,但是可以很简单地验证我们的定时任务是否可以正常执行。如果觉得每隔 5 分钟太长,那就换成“*”,让它每分钟执行一次。而且和 at 命令一样,如果我们定时执行的是系统命令,那么最好使用绝对路径。

【例 2】让系统在每周二的凌晨 5 点 05 分重启一次。

[root@localhost ~]# crontab -e
5.5 * * 2 /sbin/shutdown -r now

如果服务器的负载压力比较大,则建议每周重启一次,让系统状态归零。比如绝大多数游戏服务器每周维护一次,维护时最主要的工作就是重启,让系统状态归零。这时可以让我们的服务器自动来定时执行。

【例 3】在每月 1 日、10 日、15 日的凌晨 3 点 30 分都定时执行日志备份脚本 autobak.sh。

[root@localhost ~]# crontab -e
30.3 1,10,15 * * /root/sh/autobak.sh

这些定时任务保存之后,就可以在指定的时间执行了。我们可以使用命令来查看和删除定时任务,命令如下:

[root@localhost ~]# crontab -l
#查看root用户的crontab任务
*/5 * * * * /bin/echo "11" >> /tmp/test
5.5 * * 2 /sbin/shutdown -r now
30.3 1,10,15 * * /root/sh/autobak.sh
[root@localhost ~]# crontab -r
#删除root用户所有的定时任务。如果只想删除某个定时任务,则可以执行“crontab -e”命令进入
#编辑模式手工删除
[root@localhost ~]# crontab -l
no crontab for root
#删除后,再查询就没有root用户的定时任务了


在书写 crontab 定时任务时,需要注意以下几个事项:

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
  • crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。
http://www.jsqmd.com/news/959994/

相关文章:

  • Python函数:递归函数的定义与阶乘案例实现
  • 保姆级教程:用MQTT.fx的JS脚本5分钟模拟智能家居设备联动
  • 因果决策+分位数回归:让补货决策真正量化风险边界
  • LIO-SAM建图总跑飞?别急着调参,先检查IMU内参标定(附imu_utils保姆级教程)
  • Serverless超限怎么办?用混合架构为重载请求开辟专用通路
  • 新手福音:用快马AI将文字描述转为ER图,轻松入门数据库设计
  • Streamlit数据应用开发:Python脚本一键生成交互式Web看板
  • 别再只用plt.show()了!聊聊IPython里fig.show()的正确打开方式(附Matplotlib版本适配指南)
  • 【运维】Linux 磁盘分区相关 挂载分区卸载分区等
  • 从 MySQL 迁移到阿里云 AnalyticDB MySQL:零改造百倍加速实战教程
  • AI时代个人效能操作系统:教育设计×自由职业×注意力管理
  • 新手入门指南:基于快马AI生成你的第一个贴吧内容展示网页
  • 张量列车分解与低秩插值技术解析
  • 深度解析:XposedRimetHelper如何通过Hook技术实现智能虚拟定位
  • 别再搞混了!用Python手把手教你计算大气遥感中的散射角(附6S模型验证代码)
  • 被动调Q激光器MATLAB仿真工具:速率方程建模+脉冲参数自动提取(含Nd:YAG/Yb光纤示例)
  • 排查PCIe设备不识别?从硬件角度理解Receiver Detect失败的可能原因
  • 别再手动改路径了!PyQt5中pyrcc5.exe的3种高效定位方法(附Anaconda虚拟环境实战)
  • 【Java毕设源码分享】基于SpringBoot的农村留守儿童爱心网站的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 机器学习真实学习路径:避开环境、项目、数学三大断崖
  • 2026国际EMBA口碑排名盘点:五大高认可度项目深度测评
  • 告别单机调试:ROS1多机协同实战,让机器人A控制机器人B运动(基于Wheeltec底盘案例)
  • 2026年主播偷逃税事件的危机公关方案
  • TCD映射与簇代数在离散微分几何中的应用
  • 国产IDE崛起?实测MounRiver Studio对沁恒CH32V103/F103的友好度到底如何
  • RimWorld性能优化终极指南:如何用Performance-Fish让你的殖民地流畅运行
  • 体验人机协同编程:在快马平台如何让codex成为你的智能代码助手
  • Mac系统级ChatGPT集成:零感知调用的Shell服务方案
  • PMSM电机控制四合一Simulink模型:电流环PI调参、转速双闭环、弱磁扩速与初始化脚本
  • 多维聚合实战:从groupby到生产级数据管道