3. Linux 计划任务管理;4. Linux 进程调度管理
3. Linux 计划任务管理
一、一次性计划任务
功能:在未来特定时间点执行一次命令或脚本。
核心组件:依赖 atd 服务及相关命令(at、atq、atrm 等)。
1.atd 服务
- 需安装
at工具包(yum install at)。 - 需确保服务运行(
systemctl status atd查看状态)。
# 使用以下命令安装
[root@server ~ 17:37:37]# yum install -y at
# 确认atd服务开机启动
[root@server ~ 17:38:03]# systemctl status atd
2.at 命令(创建任务)
at 命令用于在 指定时间执行一次性任务(区别于 cron 的周期性任务)
①、命令执行结果解读
- 语法:
at <timespec>,从标准输入读取命令(按ctrl+D结束)。 - 支持从脚本读取命令:
at <时间> < 脚本文件或at <时间> -f 脚本文件。 - 时间格式(timespec):如
now +5 hours、teatime tomorrow(16:00)、noon +4 days等,详细规则见/usr/share/doc/at/timespec。
常用时间格式示例:
at 18:30:今天 18:30 执行at tomorrow 10:00:明天 10:00 执行at next Monday 14:00:下周一 14:00 执行at now +1 hour:1 小时后执行at 2025-12-31 23:59:指定具体日期时间执行
时间定义参考文档/usr/share/doc/at/timespec

[root@server ~ 17:38:19]# at now +5 minutes
at> echo hello world > /tmp/hello.log
#输入完成,按ctrl+d完成。下面的字符'<EOT>',就是安 `ctrl+d` 自动出现的。
at> <EOT>
job 1 at Thu Nov 13 17:45:00 2025
#如果输入错误,使用ctrl+backspace删除。
②、后续验证与管理操作
(1). 验证任务是否执行(17:45 后操作)
任务执行后,/tmp/hello.log 文件会被创建并写入内容,可通过以下命令查看:
# 查看文件是否存在
ls -l /tmp/hello.log# 查看文件内容(验证是否有 "hello world")
cat /tmp/hello.log#若执行成功,会输出:hello world
(2). 任务执行前的管理(17:45 前若需修改 / 删除)
-
查看当前等待执行的
at任务:atq # 或 "at -l",会列出所有未执行的 at 任务,包含任务编号、执行时间 -
删除未执行的
at任务(若无需执行):atrm 1 # 1 是你的任务编号,需与 atq 显示的编号一致
补充(脚本)
对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:
[root@server ~ 18:53:36]# vim myscript.sh
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log[[root@server ~ 18:54:44]# at now +5 minutes < myscript.sh
job 2 at Wed Dec 21 17:10:00 2022
[[root@server ~ 18:55:06]# at now +100 minutes -f myscript.sh
job 3 at Wed Dec 21 18:46:00 2022
3.at任务管理命令:
at -l或atq:查看任务队列(支持 26 个队列 a-z,优先级递减,-q可指定队列)。at -c <任务ID>:查看任务详细内容(含命令、环境变量等)。at -d/-r或atrm <任务ID>:删除指定任务。
①. at -l 或 atq
查看任务队列。
[root@centos7 ~]# at -l
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root[root@centos7 ~]# atq
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
#使用at命令使用 ==-q== 选项指定队列。
[root@centos7 ~]# at -q b now +5 minutes < myscript.sh
job 4 at Wed Dec 21 17:11:00 2022#atd提供26个队列,a到z,排的越后优先级越低。
[root@centos7 ~]# atq
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
4 Wed Dec 21 17:11:00 2022 b root[root@centos7 ~]# at -l -q b
4 Wed Dec 21 17:11:00 2022 b root# 时间到达后检测
[root@centos7 ~]# atq
3 Wed Dec 21 18:46:00 2022 a root[root@centos7 ~]# cat /tmp/hello.log
hello world[root@centos7 ~]# cat /tmp/myscript.log
Wed Dec 21 17:10:01 CST 2022
hello myscript
Wed Dec 21 17:11:00 CST 2022
hello myscript
②. at -c
查看任务详细信息。
[root@centos7 ~]# at -c 3
......
${SHELL:-/bin/sh} << 'marcinDELIMITER4bf95eea'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.logmarcinDELIMITER4bf95eea
③. at -d/-r 或 atrm
删除任务。
[root@server ~ 19:03:42]# atrm 3
[root@server ~ 19:03:55]# atq
4.限定用户
- 通过
/etc/at.allow(允许名单,存在时仅名单内用户可用)和/etc/at.deny(禁止名单,仅当at.allow不存在时生效)控制。
匹配规则如下:
- 如果 /etc/at.allow 文件存在,只有该文件中提到的用户可以使用at服务。
- 如果/etc/at.allow文件不存在,只有/etc/at.deny文件中提到的用户禁止使用at服务。
查看当前配置:允许所有用户使用at服务。
# 1. 创建 /etc/at.allow 文件(若不存在)
touch /etc/at.allow# 2. 向文件中添加允许的用户(每行一个用户)
echo "lzh" >> /etc/at.allow# 3. 验证权限(切换到不允许的用户,如普通用户 lzh,执行 at 命令)
su - lzh
at now + 1 minute -f mytask.sh # 会提示“权限被拒绝”(permission denied)[root@centos7 ~]# ls /etc/at.*
/etc/at.deny
[root@centos7 ~]# cat /etc/at.deny
二、用户周期性计划任务
周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。
- 功能:按固定周期(分、时、日等)重复执行命令或脚本。
- 核心组件:依赖
crond服务及crontab命令。 - crond 服务:后台进程管理周期性任务,未重定向的输出会通过邮件发送给任务所有者。
- crontab 命令:
crontab -l:查看当前用户的周期性任务。crontab -e:编辑任务(默认用vi,可通过EDITOR环境变量修改编辑器)。- 任务格式:6 个字段(分钟 小时 几号 月份 星期几 命令)。
- 时间字段语法:
*(始终)、x-y(范围)、x,y(列表)、*/x(间隔),星期 0/7 均表示周日,支持三字母简写(如 Jan、Mon)。 crontab -r:删除当前用户的所有周期性任务。crontab -u <用户名>:root 用户管理其他用户的任务(如查看、删除)。crontab <文件名>:从文件读取任务并覆盖当前任务。
三、系统周期性计划任务
系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:
/etc/crontab:系统级任务主配置文件/etc/cron.d/:自定义系统任务目录(避免覆盖主配置)/etc/anacrontab:保障关机后未执行任务补跑的配置文件
各配置文件详解
1. /etc/crontab:系统级任务主配置
- 核心特点:比
crontab命令(用户级)定义的任务多一个字段 ——执行用户(位于 “时间字段” 与 “命令” 之间)。
[root@centos7 ~]# cat /etc/crontab
SHELL=/bin/bash # 任务执行的Shell环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 命令查找路径
MAILTO=root # 任务输出/错误通过邮件发送给root# 任务格式说明(6个时间字段+1个用户字段+1个命令字段)
# .---------------- minute (0 - 59) 分钟
# | .------------- hour (0 - 23) 小时
# | | .---------- day of month (1 - 31) 日期
# | | | .------- month (1 - 12) OR jan,feb... 月份(支持英文简写)
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon... 星期(0/7=周日,支持英文简写)
# | | | | |
# * * * * * user-name command to be executed # 格式:时间+执行用户+命令
2. /etc/cron.d/:自定义系统任务目录
-
核心作用:存放自定义系统级任务文件,避免直接修改
/etc/crontab被系统更新(如 cronie 组件更新)覆盖;第三方应用也会在此存放任务。 -
典型示例:
/etc/cron.d/0hourly定义 “每小时执行
/etc/cron.hourly目录下所有脚本” 的任务:
# 1. 查看目录下的任务文件
[root@centos7 ~]# ls /etc/cron.d
0hourly raid-check sysstat # 0hourly是系统默认的每小时任务配置# 2. 查看0hourly内容
[root@centos7 ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly # 每小时01分,root用户执行该目录下所有脚本
run-parts:系统命令,用于按顺序执行指定目录下的所有可执行脚本。
3. /etc/anacrontab:保障任务补跑的配置
- 核心功能:解决 “系统关机期间错过的周期性任务”,重启后自动补执行;CentOS 7+ 中由 crond 进程统一管理(原由独立 anacron 进程管理)。
- 管理的任务周期:仅负责每日、每周、每月任务,对应脚本目录:
- 每日任务:
/etc/cron.daily - 每周任务:
/etc/cron.weekly - 每月任务:
/etc/cron.monthly
- 每日任务:
(1)默认内容示例
[root@centos7 ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.SHELL=/bin/sh # Shell环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 命令路径
MAILTO=root # 邮件接收者
RANDOM_DELAY=45 # 任务启动的最大随机延迟(避免所有任务同时执行,减轻系统压力)
START_HOURS_RANGE=3-22 # 任务仅在3:00-22:00之间执行# 任务格式:间隔天数 延迟分钟数 任务标识 执行命令
1 5 cron.daily nice run-parts /etc/cron.daily # 每1天,延迟5分钟,执行每日任务
7 25 cron.weekly nice run-parts /etc/cron.weekly # 每7天,延迟25分钟,执行每周任务
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly # 每月(宏@monthly),延迟45分钟,执行每月任务
(2)关键配置说明
-
配置语法:通过
NAME=value定义环境变量(如START_HOURS_RANGE=3-22限制运行时段)。 -
任务格式(4 个字段):
-
period in days,任务间隔天数(支持整数或宏:
@daily=1 天、@weekly=7 天、@monthly= 每月) -
delay in minutes,在启动该作业前,crond守护进程应等待的时间。
-
job-identifier,此为/var/spool/anacron中的文件名称,用于检查该作业是否已运行。
-
command,要执行的命令(通常是
nice run-parts 目录,nice用于调整任务优先级)。
4. Linux 进程调度管理
nuiq -c 分类统计数量
进程调度器
进程调度器可粗略分为两类:
- 实时调度器,系统中重要的进程由实时调度器调度,获得CPU能力强。
- 非实时调度器,系统中大部分进程由非实时调度器调度,获得CPU能力弱。
实时调度器
实时调度器支持的调度策略:
- SCHED_RR,roundrobin 轮询调度策略。相同优先级的进程轮流获取相同的CPU时间。
- SCHED_FIFO,先入先出调度策略。被分配到的CPU时间的进程会一直运行,直到被IO阻塞(也称为sched_yield),会被高优先级进程抢占。
非实时调度器
非实时调度器支持的调度策略:
- SCHED_NORMAL,标准的轮询方式时间共享调度,也称为SCHED_OTHER。
- SCHED_BATCH,针对批量方式执行的进程策略。不像 SCHED_NORMAL 频繁竞争,任务可以长时间运行。
- SCHED_IDLE,用于执行非常低的优先级应用。使用 SCHED_IDLE 调度策略运行的进程比nice 19运行的进程优先级还低。
管理进程优先级
非实时调度策略
nice 值
常规系统上运行的大多数进程都使用 SCHED_OTHER 调度策略。由于并非所有进程都同等重要,因此可以为使用SCHED_OTHER调度策略运行的程序指定相对优先级,称为nice值。
有40种不同级别的nice值,范围 -20(最高优先级)到 19(最低优先级):
- nice 值越高,代表优先级越低,获取CPU能力越弱。
- nice 值越低,代表优先级越高,获取CPU能力越强。
注意: 当不存在CPU资源竞争时,即使nice值高的进程也可以获得足够CPU资源。
nice 值查看
top 命令
[root@server ~ 19:45:57]# top

ps命令
#ps -o 选项用于自定义输出列
[root@server ~ 19:44:48]# ps -o nice,cmd $(pgrep systemd)
默认情况下,子进程将继承父进程的nice值,通常为0。
[root@server ~]$ md5sum /dev/zero &
[1] 55725
[root@server ~]$ ps -o pid,nice,command $$ 55725PID NI COMMAND52751 0 -bash55725 0 md5sum /dev/zero# $$ 代表当前终端中运行的 shell 程序 PID
实时调度器进程优先级和非实时调度器进程优先级对比如下:

结论: 优先级最低的实时调度器进程的优先级 高于 优先级最高的非实时调度器进程的优先级。
nice 命令
改变程序执行的优先权等级
# nice值默认是10
[root@server ~]$ nice md5sum /dev/zero &
[1] 55742[root@server ~]$ ps -o pid,nice,commandPID NI COMMAND52751 0 -bash55742 10 md5sum /dev/zero55773 0 ps -o pid,nice,command
普通用户仅允许使用正数的nice值运行程序。
# 设置一个负数优先级
[root@server ~ 15:09:24]# nice -n -2 md5sum /dev/zero &
[2] 55782
[root@server ~]$ nice: cannot set niceness: Permission denied
[root@server ~]$ ps -o pid,nice,command 55782PID NI COMMAND55782 0 md5sum /dev/zero# 设置一个正数优先级
[root@server ~]$ nice -n 2 md5sum /dev/zero &
[3] 55785
[root@server ~]$ ps -o pid,nice,command 55785PID NI COMMAND55785 2 md5sum /dev/zero
renice 命令
修改正在运行的进程的调度优先级
renice [-n] <priority> [-p|--pid|-g|--pgrp|-u|--user] <目标>...
-n <priority> | 指定要设置的 nice 值(必须参数) | renice -n 5 ... 表示将优先级设为 5 | |
|---|---|---|---|
-p <pid>... | 针对进程 ID(默认选项,可省略) | renice -n 10 -p 1234 5678 调整 PID 为 1234、5678 的进程 | |
-g <pgid>... | 针对进程组 ID | renice -n -5 -g 987 调整进程组 987 的优先级 | |
| `-u <user | id>…` | 针对指定用户(用户名或 UID)的所有进程 | renice -n 3 -u tom 1001 调整用户 tom 和 UID 1001 的进程 |
-h, --help | 显示帮助信息 | - | |
-V, --version | 显示版本信息 | - |
修改上面示例中产生的进程的优先级。
# PID 为 55782 的进程的 nice 值设置为 2。
[root@server ~]$ renice -n 2 55782
55782 (process ID) old priority 0, new priority 2
#查看进程 ID 为 55782 的进程的进程 ID、优先级(nice 值)和命令行信息。
[root@server ~]$ ps -o pid,nice,command 55782PID NI COMMAND55782 2 md5sum /dev/zero
普通用户只能升高进程nice值,不能降低。
[root@server ~]$ renice -n -2 55782
renice: failed to set priority for 55782 (process ID): Permission denied
[root@server ~]$ ps -o pid,nice,command 55782PID NI COMMAND55782 2 md5sum /dev/zero# 使用root用户调整
[root@centos7 ~]# renice -n -2 55782
55782 (process ID) old priority 2, new priority -2
[root@centos7 ~]# renice -n -2 55785
55785 (process ID) old priority 2, new priority -2
[root@server ~]$ ps -o pid,nice,command 55782 55785PID NI COMMAND55782 -2 md5sum /dev/zero55785 -2 md5sum /dev/zero
top 命令
top 界面查看进程CPU使用率:55782和55785,CPU使用率非常接近,因为优先级一致。

在该界面中使用 r 指令设置进程nice值。
终止之前创建的3个md5sum进程。
[root@server ~]$ pkill md5sum
[1] 已终止 nice md5sum /dev/zero
[2]- 已终止 nice -n -2 md5sum /dev/zero
[3]+ 已终止 nice -n 2 md5sum /dev/zero
实时调度策略
chrt 命令用于获取和设置实时调度器进程优先级,以及更改进程调度器。
[root@centos7 ~]# chrt --help
Set policy:chrt [options] <priority> <command> [<arg>...]chrt [options] --pid <priority> <pid>chrt [options] -p <pid>
选项说明
调度策略选项:
-b或--batch:将策略设置为SCHED_BATCH,适用于批处理进程,优先级参数必须设置为零。
-d或--deadline:将策略设置为SCHED_DEADLINE,需搭配-T、-P、-D等选项设置相关时间参数。
-f或--fifo:设置调度策略为SCHED_FIFO,即先到先服务,进程会一直运行直到主动让出或被阻塞。
-i或--idle:设置策略为SCHED_IDLE,用于非常低优先级的作业,优先级参数必须设置为零。
-o或--other:设置为SCHED_OTHER,这是 Linux 默认的分时调度策略。
-r或--rr:设置策略为SCHED_RR,即时间片轮转调度,当未指定策略时,默认使用该策略。
调度选项:
-R或--reset-on-fork:将SCHED_RESET_ON_FORK标志添加到SCHED_FIFO或SCHED_RR调度策略。
-T或--sched-runtime <ns>:指定SCHED_DEADLINE策略的运行时参数,单位为纳秒。
-P或--sched-period <ns>:指定SCHED_DEADLINE策略的周期参数,单位为纳秒。
-D或--sched-deadline <ns>:指定SCHED_DEADLINE策略的截止时间参数,单位为纳秒。
其他选项:
-a或--all-tasks:操作给定 pid 的所有任务(线程)的调度属性。
-m或--max:显示最小和最大有效优先级,然后退出。
-p或--pid:针对已存在的 pid 进行操作,不启动新任务。
-v或--verbose:显示详细状态信息。
--help:显示帮助信息并退出。
--version:输出版本信息并退出
示例
# 查看进程优先级范围,chrt不能用于调整非实时进程nice值优先级。
[root@centos7 ~]# chrt -m
SCHED_OTHER min/max priority : 0/0
SCHED_FIFO min/max priority : 1/99
SCHED_RR min/max priority : 1/99
SCHED_BATCH min/max priority : 0/0
SCHED_IDLE min/max priority : 0/0
SCHED_DEADLINE min/max priority : 0/0# 以SCHED_RR调度器和优先级为5运行md5sum进程
[root@centos7 ~]# chrt -r 5 md5sum /dev/zero &
[1] 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225PID CLS RTPRIO COMMAND56225 RR 5 md5sum /dev/zero# 修改进程调度器和优先级
[root@centos7 ~]# chrt -f --pid 10 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225PID CLS RTPRIO COMMAND56225 FF 10 md5sum /dev/zero# 修改进程调度器为非实时
[root@centos7 ~]# chrt -o --pid 0 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225PID CLS RTPRIO COMMAND56225 TS - md5sum /dev/zero
以SCHED_RR调度器和优先级为5运行md5sum进程
[root@centos7 ~]# chrt -r 5 md5sum /dev/zero &
[1] 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225
PID CLS RTPRIO COMMAND
56225 RR 5 md5sum /dev/zero
修改进程调度器和优先级
[root@centos7 ~]# chrt -f --pid 10 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225
PID CLS RTPRIO COMMAND
56225 FF 10 md5sum /dev/zero
修改进程调度器为非实时
[root@centos7 ~]# chrt -o --pid 0 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225
PID CLS RTPRIO COMMAND
56225 TS - md5sum /dev/zero
