Linux计划任务管理

一次性计划任务

一次性的指在未来某个时间点执行一个命令或一系列命令

atd 服务

Linux 系统中at提供一次性计划任务功能。

at不是一个单独的工具,包括系统后台进程(atd)和一系列与后台进程atd交互的命令

#安装插件
[root@webapp ~ 14:05:59]# yum install -y at
[root@webapp ~ 14:06:06]# at 14:08 
at> tar -cxf etc.tar.gz /etc
at> <EOT>
job 1 at Thu Sep 18 14:08:00 2025
Can't open /var/run/atd.pid to signal atd. No atd running?
#没有设置成功,因为没有激活atd服务

[root@webapp ~ 14:06:44]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
[root@webapp ~ 14:07:56]# systemctl start atd
[root@webapp ~ 14:08:05]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 四 2025-09-18 14:08:05 CST; 2s ago
 Main PID: 26058 (atd)
   CGroup: /system.slice/atd.service
           └─26058 /usr/sbin/atd -f

918 14:08:05 webapp.dcr.cloud systemd[1]: Started Job spoo...
918 14:08:05 webapp.dcr.cloud atd[26059]: Starting job 1 (...
Hint: Some lines were ellipsized, use -l to show in full.

#重新设置任务
[root@webapp ~ 14:30:34]# at 14:32
at> tar -czf etc.tar.gz /etc   
at> <EOT>
job 4 at Thu Sep 18 14:32:00 2025
[root@webapp ~ 14:31:15]# at -l
4	Thu Sep 18 14:32:00 2025 a root

#下载mailx 可以通过mail查看有没有执行任务
[root@webapp ~ 14:29:48]# yum install -y mailx
[root@webapp ~ 14:30:20]# which mail
/usr/bin/mail

[root@webapp ~ 14:31:21]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 4 messages 1 new 4 unread
 U  1 root                  Thu Sep 18 14:08  16/611   "Output from your"
 U  2 root                  Thu Sep 18 14:09  16/611   "Output from your"
 U  3 root                  Thu Sep 18 14:22  16/611   "Output from your"
>N  4 root                  Thu Sep 18 14:32  14/505   "Output from your"
& Held 4 messages in /var/spool/mail/root
您在 /var/spool/mail/root 中有邮件
[root@webapp ~ 14:32:25]# ls
anaconda-ks.cfg  etc.tar.gz  

at命令

at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入

[root@webapp ~ 18:16:36]# at now +5 minutes
at> echo hello world > hello.txt
at> <EOT>
job 5 at Thu Sep 18 18:28:00 2025

输入完成,按ctrl+d完成。上面的字符’',就是安 ctrl+d 自动出现的。

如果输入错误,使用ctrl+backspace删除。

对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:

[root@webapp ~ 18:27:13]# at now + 5 minutes< hi.txt
job 6 at Thu Sep 18 18:33:00 2025
[root@webapp ~ 18:28:06]# at now + 5 minutes -f hi.txt
job 7 at Thu Sep 18 18:33:00 2025

利用-f或者< 传递文件内容

timespec允许多种时间组合。例如,02:00 pm,15:43,或者teatime,后接日期或未来的天数。

示例:

  • now +5 hours
  • teatime tomorrow (teatime 16:00)
  • noon +4 days(noon 12:00)
  • 5 pm august 3 2016

时间定义参考文档/usr/share/doc/at/timespec

at -l 或 atq

查看任务列表

[root@webapp ~ 18:28:30]# at -l
6	Thu Sep 18 18:33:00 2025 a root
7	Thu Sep 18 18:33:00 2025 a root

[root@webapp ~ 18:32:15]# atq
6	Thu Sep 18 18:33:00 2025 a root
7	Thu Sep 18 18:33:00 2025 a root

atd提供26个队列,a到z,排的越后优先级越低。使用at命令使用-q选项指定队列

[root@webapp ~ 18:38:14]# at -q b now + 5 minutes <hi.txt
job 8 at Thu Sep 18 18:44:00 2025
[root@webapp ~ 18:39:33]# at now + 5 minutes <hi.txt
job 9 at Thu Sep 18 18:44:00 2025
[root@webapp ~ 18:39:50]# at now + 5 minutes <hi.txt
job 10 at Thu Sep 18 18:44:00 2025
[root@webapp ~ 18:39:53]# at -l
8	Thu Sep 18 18:44:00 2025 b root
9	Thu Sep 18 18:44:00 2025 a root
10	Thu Sep 18 18:44:00 2025 a root
at -c

查看任务详细信息(数字是job的数)

[root@webapp ~ 18:40:02]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
....
at -d/-r 或 atrm

删除任务

[root@webapp ~ 18:42:48]# at -d 8
[root@webapp ~ 18:43:06]# at -r 9
[root@webapp ~ 18:43:15]# atrm 10
[root@webapp ~ 18:43:23]# at -l 

限定用户

/etc/at.allow 和 /etc/at.deny 控制哪些人可以使用atd服务。

匹配规则如下:

  1. 如果 /etc/at.allow 文件存在,只有该文件中提到的用户可以使用at服务。
  2. 如果/etc/at.allow文件不存在,只有/etc/at.deny文件中提到的用户禁止使用at服务。

用户周期性计划任务

周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。

crond 服务

Linux 系统中cron 提供周期性计划任务功能。

cron包括系统后台进程(crond)、crontab 命令和多个配置文件。

用户可以使用 crontab 命令管理自己的周期性作业。

如果cron job运行的命令没有重定向 stdout 和 stderr,crond进程将通过邮件发送给job所有者

crontab命令

crontab -l

查看周期性任务

[dcr@webapp ~ 18:48:00]$ crontab -l
no crontab for dcr
crontab -e

该命令默认使用vi编辑周期性计划任务:

  • 可以申明环境变量,格式为name=value,将影响声明之后的所有行。crontab使用的常规环境变量有SHELL和MAILTO。发送邮件需要额外的配置:mail服务器和smtp。
  • 空行是允许的。
  • 以#开头的行是注释行。
  • 每一行是一个job。

默认编辑器可以通过EDITOR环境变量设定。

每一个jobs包涵6个部分:五个时间和一个要执行的命令,按以下顺序显示:

  • 分钟
  • 小时
  • 几号
  • 月份
  • 星期几
  • 命令

前五个字段全部使用相同的语法规则:

  • *,表示“无关紧要”,始终。
  • 数字可用于指定分钟数或小时数、日期或者工作日。对于工作日,0表示星期日,1表示星期一,2表示星期二,依此类推。7也表示星期曰。
  • x-y:表示范围:x到y(含)。
  • x,y:表示列表。列表也可以包含范围,例如,5,10-13,17表示作业应当在每小时过去5分钟、10分钟、11分钟、12分钟、13分钟和17分钟后运行。
  • */x,表示x的时间间隔,例如列中的*/7表示每七分钟运行一次作业。
  • 最后一个区域是要执行的命令,命令通过/bin/sh执行,除非指定SHELL变量。如果命令中包涵未转义字符%,则表示开启新行,并且%后面所有字符作为标准输入。

月和周区域可以使用三字母简写单词,Jan,Feb,Mar和Mon,Tue。

  • 以下作业将在七月每周五的上午9点和下午4点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件
*/5 9-16 * 7 5 echo Chime
  • 以下作业将在每个工作日午夜前的两分钟运行命/usr/local/bin/daily_report
58 23 * * 1-5 /usr/local/bin/daily_report
[root@webapp ~ 18:49:43]# export EDITOR=vim
[root@webapp ~ 18:55:15]# crontab -e
crontab: installing new crontab
[root@webapp ~ 18:56:27]# crontab -l
*/2 2,3-23 * * * date >> /tmp/date.log
# tail -f /tmp/date.log  动态监控
crontab -r

删除所有周期性计划任务

[root@webapp ~ 18:56:31]# crontab -r
[root@webapp ~ 18:57:59]# crontab -l
no crontab for root
crontab -u

root用户可以使用参数 -u username 管理其他用户周期性作业

[root@webapp ~ 18:58:03]# crontab -u dcr -e
no crontab for dcr - using an empty one
crontab: no changes made to crontab
#给其他用户创建任务
[root@webapp ~ 18:58:55]# crontab -u dcr -l
no crontab for dcr
#展示其他用户的任务
[root@webapp ~ 18:59:27]# crontab -u dcr -r
no crontab for dcr
#删除其他用户的任务
crontab (filename)

还可以使用crontab filename 命令从文件 filename 中读取的作业并替换当前所有作业

[root@webapp ~ 18:59:50]# vim mycron
[root@webapp ~ 19:01:34]# cat mycron
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
[root@webapp ~ 19:01:41]# crontab mycron
[root@webapp ~ 19:02:31]# crontab -l
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.

系统周期性计划任务

系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:

  • /etc/crontab
  • /etc/cron.d/ 目录
  • /etc/anacrontab

/etc/crontab

crond的配置文件比crontab命令定义的jobs多一个区域,在最后一个时间和command之间,指明使用哪个账户执行job

[root@webapp ~ 19:03:02]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

/etc/cron.d

系统周期性作业应始终在 /etc/cron.d/ 目录中创建自定义crontab文件,防止cronie更新后覆盖/etc/crontab文件。其他应用也会将系统周期性作业存放在该目录。

/etc/cron.d/0hourly定义了每小时要执行的任务: run-parts /etc/cron.hourly

作用:每小时将 /etc/cron.hourly目录下所有脚本按顺序执行一次

[root@webapp ~ 19:04:27]# ls /etc/cron.d
0hourly  sysstat

[root@webapp ~ 19:07:49]# 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

/etc/anacrontab

在过去,/etc/anacrontab 由单独的一个进程anacron处理,在CentOS 7 及后续版本中,这个文件也由 crond 进程处理,目的是确保重要的工作总是被执行,即使系统关机或者其他重大事故。

/etc/anacrontab 定义了每天、每周、每个月要运行的任务。

周期性执行任务目录:

  • 每天要执行的任务目录:/etc/cron.daily
  • 每周要执行的任务目录:/etc/cron.weekly
  • 每月要执行的任务目录:/etc/cron.monthly
[root@webapp ~ 19:06:01]# ls /etc/cron.
cron.d/       cron.deny     cron.monthly/ 
cron.daily/   cron.hourly/  cron.weekly/  

[root@webapp ~ 19:07:57]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

/etc/anacrontab 使用语法 NAME=value 配置 anacrontab。

例如,START_HOURS_RANGE=3-22,作业只能在此时间段运行。

/etc/anacrontab 每行包涵4个区域:

  • period in days,按重复计划运行的作业的间隔天数。该字段接受整数或宏作为值。例如,宏@daily相当于整数1,它表示每天执行该作业。同样,宏@weekly相当于整数7,它表示每周执行该作业。
  • delay in minutes,在启动该作业前,crond守护进程应等待的时间。
  • job-identifier,此为/var/spool/anacron中的文件名称,用于检查该作业是否已运行。
  • command,要执行的命令。

Linux 进程调度管理

进程调度器

现代计算机系统中既包含只有单个CPU且任何时候都只能处理单个指令的低端系统到具有几百个cpu、每个cpu有多个核心的高性能超级计算机,可以并行执行几百个指令。所有这些系统都有一个共同点:系统进程线程数量超出了CPU数量。

Linux系统看起来可以同时执行多个进程,多个进程轮流使用CPU。内核使用进程调度器决定如何分配CPU时间。为了更好地运行,进程调度器必须平衡不同的条件,快速决定下个执行的进程,确保进程获得公平的CPU时间:

  • 按时间片轮转(10-20ms为1个时间片 )
  • 按优先级调度,允许高优先级进程获取更多的共享CPU时间,低优先级进程获取更少的共享CPU时间。

在这里插入图片描述

在这里插入图片描述

进程调度器可粗略分为两类:

  • 实时调度器,系统中重要的进程由实时调度器调度,获得CPU能力强
  • 非实时调度器,系统中大部分进程由非实时调度器调度,获得CPU能力弱。

实时调度器(暂不掌握)

实时调度器支持的调度策略:

  • SCHED_RR,roundrobin 轮询调度策略。相同优先级的进程轮流获取相同的CPU时间。
  • SCHED_FIFO,先入先出调度策略。被分配到的CPU时间的进程会一直运行,直到被IO阻塞(也称为sched_yield),会被高优先级进程抢占。

实时调度器管理的进程运行优先级范围如下:

在这里插入图片描述

即使系统运行实时调度程序,也要保持可响应状态,至少ssh可用。

管理员可以使用以下两个sysctl参数,阻止实时调度策略下运行的程序占用所有CPU时间:

  • kernel.sched_rt_runtime_us,在kernel.sched_rt_period_us内实时态进程可使用的共享CPU时间,默认值950000,也就是0.95秒。设置为0,实时调度进程将无法获取CPU时间。

  • kernel.sched_rt_period_us,CPU分配的周期时间,单位us,默认值1000000,也就是1秒。

    从kernel.sched_rt_period_us 中减去 kernel.sched_rt_runtime_us 后的剩余时间交给非实时调度器SCHED_NORMAL调度。

  • kernel.sched_rr_timeslice_ms,在SCHED_RR调度下的进程每次轮询获取的CPU时间,单位ms,默认值100,也就是0.1秒,有效范围1-100。

非实时调度器

非实时调度器支持的调度策略:

  • 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资源。FF系统性进程的nice值永远大于TS其他进程

nice查看
top命令

在这里插入图片描述

ps命令
[root@webapp ~ 19:22:59]# ps axo nice,pid,class,cmd | sort |head 
  0    101 TS  [kauditd]
  0   1158 TS  /usr/sbin/rsyslogd -n
  0   1163 TS  /usr/sbin/sshd -D
  0   1164 TS  /usr/bin/python2 -Es /usr/sbin/tuned -l -P
  0   1207 TS  sshd: root@pts/0
  0   1297 TS  /usr/libexec/postfix/master -w
  0   1305 TS  qmgr -l -t unix -u
  0   1306 TS  -bash
  0   1447 TS  sshd: root@pts/1
  0   1449 TS  -bash

默认情况下,子进程将继承父进程的nice值,通常为0

[root@webapp ~ 19:24:00]# md5sum /dev/zero &
[1] 2224
[root@webapp ~ 19:27:59]# ps -C md5sum -o pid,ppid,cmd
   PID   PPID CMD
  2224   1899 md5sum /dev/zero
[root@webapp ~ 19:28:13]# ps -o nice,class,pid,cmd 2224 1899
 NI CLS    PID CMD
  0 TS    1899 -bash
  0 TS    2224 md5sum /dev/zero

实时调度器进程优先级和非实时调度器进程优先级对比如下:

在这里插入图片描述

结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。

nice 命令
[root@webapp ~ 19:29:20]# nice --help
用法:nice [选项] [命令 [参数]...]
Run COMMAND with an adjusted niceness, which affects process scheduling.
With no COMMAND, print the current niceness.  Niceness values range from
-20 (most favorable to the process) to 19 (least favorable to the process).

Mandatory arguments to long options are mandatory for short options too.
  -n, --adjustment=N   add integer N to the niceness (default 10)
      --help		显示此帮助信息并退出
      --version		显示版本信息并退出

注意:您的shell 内含自己的nice 程序版本,它会覆盖这里所提及的相应
版本。请查阅您的shell 文档获知它所支持的选项。

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告nice 的翻译错误
要获取完整文档,请运行:info coreutils 'nice invocation'
[root@webapp ~ 19:33:39]# nice md5sum /dev/zero &
[2] 2280
[root@webapp ~ 19:35:23]# ps -o pid,nice,command
   PID  NI COMMAND
  1899   0 -bash
  2224   0 md5sum /dev/zero
  2280  10 md5sum /dev/zero
  2281   0 ps -o pid,nice,command
#nice值默认是10,md5sum /dev/zero & 是0

普通用户仅允许使用正数的nice值运行程序

# 设置一个负数优先级
[dcr@webapp ~ 19:37:10]$ nice -n -2 md5sum /dev/zero &
[2] 55780
[dcr@webapp ~ 19:37:45]$ nice: cannot set niceness: Permission denied
[dcr@webapp ~ 19:38:12]$ ps -o pid,nice,command 55782
   PID  NI COMMAND
 55780   0 md5sum /dev/zero

# 设置一个正数优先级
[dcr@dcr ~ 19:38:57]$ nice -n 2 md5sum /dev/zero &
[3] 55782
[dcr@webapp ~ 19:39:02]$ ps -o pid,nice,command 55785
   PID  NI COMMAND
 55782   2 md5sum /dev/zero
renice 命令
[root@webapp ~ 19:35:36]# renice --help

用法:
 renice [-n] <优先级> [-p|--pid] <pid>...
 renice [-n] <优先级>  -g|--pgrp <pgid>...
 renice [-n] <优先级>  -u|--user <用户>...

选项:
 -g, --pgrp <id>        将参数解释为进程组 ID
 -n, --priority <数字>  指定 nice 增加值
 -p, --pid <id>         将参数解释为进程 ID (默认)
 -u, --user <name|id>   将参数解释为用户名或用户 ID
 -h, --help             显示帮助文本并退出
 -V, --version          显示版本信息并退出

更多信息请参阅 renice(1)
[root@webapp ~ 19:39:55]# renice -n 5 -p 2224
2224 (进程 ID) 旧优先级为 0,新优先级为 5
[root@webapp ~ 19:41:01]# ps -o pid,nice,command
   PID  NI COMMAND
  1899   0 -bash
  2224   5 md5sum /dev/zero
  2280  10 md5sum /dev/zero
  2291   0 ps -o pid,nice,command

普通用户只能升高进程nice值,不能降低

[dcr@webapp ~ 19:43:19]$ renice -n -2 55782
renice: failed to set priority for 55782 (process ID): Permission denied
[dcr@weapp ~ 19:43:57]$ ps -o pid,nice,command 55782
   PID  NI COMMAND
 55783   2 md5sum /dev/zero
top命令
[root@webapp ~ 19:46:22]# nice -n 5 md5sum /dev/zero &
[1] 1429
[root@webapp ~ 19:46:48]# nice -n 10 md5sum /dev/zero &
[2] 1430

在这里插入图片描述

按r 回车(默认第一个进程pid),输入新的nice值

在这里插入图片描述

pkill md5sum 可以全部杀死,也可以在top界面按k 回车 回车一个一个删除

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐