Linux - 任务管理
文章目录
任务管理概述
在系统运维过程中,可能需要在某个预设的时间执行特定任务。比如定时发送邮件、备份并清空日志文件等任务。
任务的内容可以看作是一系列命令或者一个脚本,我们则需要在特定时间去执行它。
任务管理的类型
- 计划执行,在特定时间运行一次:
at
- 定期执行,按周期执行多次:
cron
计划执行 at
如果系统未安装 at,则先安装并启动:
yum install -y at systemctl start at
- at 命令可以指定 Linux 在特定时刻运行脚本
- atd 是 at 的守护进程,在系统启动时就会以后台模式运行
- atd 进程会定期检查系统上的 /var/spool/at 目录,获取通过 at 命令写入的任务
at 命令
用户使用 at 命令在指定时刻执行指定的命令序列,该命令至少需要指定一个命令和一个执行时间,可以只指定时间,也可以时间和日期一起指定
at 命令语法: at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间 at -c 作业[作业...]
设置时间 - 绝对计时
at 允许使用一套相当复杂的时间指定方法:
- 接受在当天的 hh:mm(小时:分钟)式的时间指定;如果该时间已经过去,那么就放存第二天执行
- 使用 midnight(深夜)、noon(中午)、teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间
- 采用 12 小时计时制,即在时间后面加上 AM 或者 PM 来说明是上午还是下午
- 指定命令执行的具体日期,指定格式为month day(月日)或者 mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年);指定的日期必须跟在指定时间的后面
设置时间 - 相对计时
使用相对计时法,对于安排不久后就要执行的命令较为方便:
- 指定格式为 now+count time-units,now就是当前时间,time-units 是时间单位,这里可以是minutes(分钟)、hours(小时)、days(天)、weeks(星期)
- count 是时间的数量,究竟是几天,还是几小时等;还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间
- 例如指定在今天 16:30 执行某个命令;假设现在时间是 12:30,2015年6月7日,命令如下:
at 4:30pm at 16:30 at 16:30 today at now+4 hours at now+240 minutes at 16:30 7.6.15 at 16:30 6/7/15 at 16:30 Jun 7
以上 8 条命令的执行效果完全相同。
配置步骤:
at + 时间
, 输入完成后,进入交互式界面,按 Ctrl + d 结束命令的输入at -f file-name.sh 时间
,可执行特定脚本文件- 使用
atq
命令查看作业队列 - 使用
atrm
命令可以删除作业队列中的作业,格式为 atrm + 作业号,作业号 为 atq 回显的第一列
执行权限
对于 at 命令来说,需要定时执行的命令是从标准输入或者使用 –f 选项指定的文件中读取并执行的。如果 at 命令是从一个使用 su 命令切换到用户 shell 中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户;对于其他用户来说,是否执行某个命令或脚本取决于 /etc/at.allow 和 /etc/at.deny 文件
周期性运行程序 - cron
at 命令会在指定时间内完成指定任务,但是只能执一次;系统在指定时间完成任务,以后就不再执行了。而在很多情况下需要周期性重复执行一些命令,这时候需要使用 cron 命令来完成任务。
cron 运行机制
- cron 会搜索 /var/spool/cron 目录,寻找以
/etc/passwd
文件中的用户名命名的 crontab 文件,然后将 crontab 文件装入内存。比如一个用户名为globus的用户,对应的crontab立件应该是/var/spool/cron/globus,即以该用户命名的crontab文件存放在/var/spool/cron目录下面。 - cron 还将搜索 /etc/crontab 文件,这个文件(cron 时间表)是以特定格式写成的
- cron 启动以后,先检查是否有用户设置了crontab文件,如果没有就转入睡眠状态,释放系统资源;所以该后台进程占用资源极少,之后每分钟被换醒一次,查看当前是否有需要运行的命令
- 命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是
/etc/crontab
文件中MAILTO环境变量中指定的用户。这是cron的工作原理,但是cron命令的执行不需要用户干涉,用户只需要修改crontab中要执行的命令。
crontab 命令
crontab 命令用于安装、删除或者显示用于驱动 cron 后台进程的表格。用户把需要执行的命令序列放到 crontab 文件中以获得执行,而且每个用户都可以有自己的 crontab 文件。
crontab 常用命令: crontab -u //设置某个用户的cron服务,root用户在执行crontab时需要此参数 crontab -l //列出某个用户cron服务的详细内容 crontab -r //删除某个用户的cron服务 crontab -e //编辑某个用户的cron服务
crontab 文件
在 crontab 文件中输入需要执行的命令和时间,该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔,格式如下:
minute hour day-of-month month-of-year day-of-week commands
例:每周一上午 8:00 执行命令
00 08 * * 1 commands
crontab 文件参数补充
- 上述参数项都不能为空,必须指定值
- 对于要执行的命令,调用的时候需要写出命令的绝对路径
- 除了数字还有几个特殊的符号“*”、“/”和“-”、“,”
例:晚上11点到早上8点之间每两个小时,在/tmp/test.txt文件中加入sleepy文本,在 crontab 文件中对应的行如下:
* 23-8/2 * * * echo"sleepy" >> /tmp/test.txt
注意:每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。cron启动后,每过一分钟读一次crontab文件,检查是否要执行里面的命令。因此该文件被修改后不需要重新启动cron服务。
编辑配置文件
cron 服务每分钟不仅要读一次 /var/spool/cron
内的所有文件,还需要读一次/etc/crontab
。使用 crontab 配置是针对某个用户的,而编辑 /etc/crontab 是针对系统的任务。
此文件的文件格式如下:
SHELL=/bin/sh PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个账号 HOME=/ # run-parts01 * * * * root run-parts /etc/cron.hourly //每个小时执行一次/etc/cron.hourly里的脚本 02 4 * * * root run-parts /etc/cron.daily //每天执行一次/etc/cron.daily里的脚本 22 4 * * 0 root run-parts /etc/cron.weekly //每周执行一次/etc/cron.weekly里的脚本 42 4 1 * * root run-parts /etc/cron.monthly //每月执行一次/etc/cron.monthly里的脚本
注意:如果去掉run-parts参数,其后面就是运行的某个脚本名,而不是目录名。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!