学会 Linux 两大调度神器,自动化运维直接少干一半活

📅 2026/7/30 7:24:20
学会 Linux 两大调度神器,自动化运维直接少干一半活
Linux 计划任务管理一次性计划任务一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。atd 服务Linux 系统中at提供一次性计划任务功能。at不是一个单独的工具包括系统后台进程atd和一系列与后台进程atd交互的命令例如at atq等等。# 使用以下命令安装[dengcentos7 ~19:30:00]$ yuminstallat# 确认atd服务开机启动[dengcentos7 ~19:30:42]$ 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-07-2916:54:08 CST;3min 22s ago Main PID:1184(atd)Tasks:1CGroup: /system.slice/atd.service └─1184 /usr/sbin/atd-f7月2916:54:08 centos7.linux.com systemd[1]: Started Job spooling tools.at 命令语法at timespecat命令从标准输入中读取要执行的命令。手动输入命令时按ctrlD完成输入。示例[dengcentos7 ~19:31:15]$ at now 5 minutes atechohello world/tmp/hello.log atEOTjob1at 三7月2919:36:002025输入完成按ctrld完成。上面的字符’就是按ctrld自动出现的。如果输入错误使用ctrlbackspace删除。对于大量的命令或者错字敏感的命令可以通过重定向和-f选项从脚本中读取例如[dengcentos7 ~19:32:47]$vimmyscript.sh#!/bin/bashdate/tmp/myscript.logechohello myscript/tmp/myscript.log[dengcentos7 ~19:33:12]$ at now 5 minutesmyscript.sh job2at 三7月2919:38:002025[dengcentos7 ~19:33:25]$ at now 100 minutes-fmyscript.sh job3at 三7月2921:13:002025timespec允许多种时间组合。例如02:00 pm15:43或者teatime后接日期或未来的天数。示例now 5 hoursteatime tomorrow (teatime 16:00)noon 4 days(noon 12:00)5 pm august 3 2016时间定义参考文档 /usr/share/doc/at/timespecat -l 或 atq查看任务队列。[dengcentos7 ~19:34:02]$ at-l1三7月2919:36:002025a deng2三7月2919:38:002025a deng3三7月2921:13:002025a deng[dengcentos7 ~19:34:18]$ atq1三7月2919:36:002025a deng2三7月2919:38:002025a deng3三7月2921:13:002025a dengatd提供26个队列a到z排的越后优先级越低。使用at命令使用-q选项指定队列。[dengcentos7 ~19:35:18]$ at-qb now 5 minutesmyscript.sh job4at 三7月2919:40:002025[dengcentos7 ~19:35:33]$ atq1三7月2919:36:002025a deng2三7月2919:38:002025a deng3三7月2921:13:002025a deng4三7月2919:40:002025b deng[dengcentos7 ~19:35:47]$ at-l-qb4三7月2919:40:002025b deng# 时间到达后检测[dengcentos7 ~19:36:05]$ atq3三7月2921:13:002025a deng[dengcentos7 ~19:36:19]$cat/tmp/hello.log hello world[dengcentos7 ~19:36:33]$cat/tmp/myscript.log 三7月2919:38:01 CST2025hello myscript 三7月2919:40:00 CST2025hello myscriptat -c查看任务详细信息。[dengcentos7 ~19:37:00]$ at-c3......${SHELL:-/bin/sh}marcinDELIMITER4bf95eea #!/bin/bash date /tmp/myscript.log echo hello myscript /tmp/myscript.log marcinDELIMITER4bf95eeaat -d/-r 或 atrm删除任务。[dengcentos7 ~19:37:45]$ atrm3[dengcentos7 ~19:37:58]$ atq限定用户/etc/at.allow 和 /etc/at.deny 控制哪些人可以使用atd服务。匹配规则如下如果 /etc/at.allow 文件存在只有该文件中提到的用户可以使用at服务。如果/etc/at.allow文件不存在只有/etc/at.deny文件中提到的用户禁止使用at服务。查看当前配置允许所有用户使用at服务。[dengcentos7 ~19:38:12]$ls/etc/at.* /etc/at.deny[dengcentos7 ~19:38:25]$cat/etc/at.deny# 内容为空用户周期性计划任务周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。crond 服务Linux 系统中cron 提供周期性计划任务功能。cron包括系统后台进程crond、crontab 命令和多个配置文件。用户可以使用 crontab 命令管理自己的周期性作业。如果cron job运行的命令没有重定向 stdout 和 stderrcrond进程将通过邮件发送给job所有者。crontab 命令crontab -l查看周期性计划任务。[dengcentos7 ~19:40:00]$crontab-lnocrontabfordengcrontab -e该命令默认使用vi编辑周期性计划任务可以申明环境变量格式为namevalue将影响声明之后的所有行。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变量。如果命令中包涵未转义字符%则表示开启新行并且%后面所有字符作为标准输入。月和周区域可以使用三字母简写单词JanFebMar和MonTue。示例以下作业将在每年2月2日上午9点准点执行命令/usr/local/bin/yearly_backup。0922* /usr/local/bin/yearly_backup以下作业将在七月每周五的上午9点和下午4点间每五分钟向该作业的所有者发送包含单词Chime的电子邮件。*/59-16 * Jul5echoChime以下作业将在每个工作日午夜前的两分钟运行命/usr/local/bin/daily_report。5823* *1-5 /usr/local/bin/daily_report以下作业将在每个工作日周一到周五上午9点执行mutt命令从而将邮件消息Checkingin发送给收件人bossexample.com。09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.示例[dengcentos7 ~19:41:00]$exportEDITORvim[dengcentos7 ~19:41:15]$crontab-e*/22,6-23 * * *date/tmp/date.log[dengcentos7 ~19:41:33]$crontab-l*/22,3-23 * * *date/tmp/date.log# 监控日志[dengcentos7 ~19:41:50]$tail-f/tmp/date.log2025年 07月29日 星期三21:02:01 CST2025年 07月29日 星期三21:04:01 CST......crontab -r删除所有周期性计划任务。[dengcentos7 ~19:42:05]$crontab-r[dengcentos7 ~19:42:18]$crontab-lnocrontabfordengcrontab -uroot用户可以使用参数-u username管理其他用户周期性作业。[dengcentos7 ~19:42:30]$crontab-udeng-e0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.[dengcentos7 ~19:42:45]$crontab-udeng-r[dengcentos7 ~19:42:58]$crontab-udeng-lnocrontabfordengcrontab filename还可以使用crontab filename命令从文件filename中读取的作业并替换当前所有作业。[dengcentos7 ~19:43:12]$vimmycron0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.[dengcentos7 ~19:43:30]$crontabmycron[dengcentos7 ~19:43:45]$crontab-l0922* /usr/local/bin/yearly_backup09* *1-5mutt-sChecking inbossexample.com % Hi boss, just checking in.练习编写一个简单的脚本/usr/local/bin/myjob脚本内容要求如下第一个命令 计算 /dev/zero md5值md5sum /dev/zero 第二个命令 休息20秒 sleep 20第三个命令 kill掉之前 的md5程序。7月份奇数号11-18点之间每隔2分钟执行一次。参考答案# 1.开发脚本[dengcentos7 ~19:44:00]$vim/usr/local/bin/myjob#!/bin/bashmd5sum /dev/zerosleep20pkillmd5sum[dengcentos7 ~19:44:18]$chmodx /usr/local/bin/myjob# 2. 配置定时任务[dengcentos7 ~19:44:35]$crontab-e[dengcentos7 ~19:44:48]$crontab-l*/211-18 */27* /usr/local/bin/myjob# 3. 监视任务执行# journalctl -f 监视 cron 执行# top 监视 md5sum 程序运行和终止系统周期性计划任务系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业/etc/crontab/etc/cron.d/ 目录/etc/anacrontab/etc/crontabcrond的配置文件比crontab命令定义的jobs多一个区域在最后一个时间和command之间指明使用哪个账户执行job。[dengcentos7 ~19:46:00]$cat/etc/crontabSHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot# 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) (Sunday0 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目录下所有脚本按顺序执行一次。[dengcentos7 ~19:47:00]$ls/etc/cron.d 0hourly raid-check sysstat[dengcentos7 ~19:47:15]$cat/etc/cron.d/0hourly# Run the hourly jobsSHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot 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[dengcentos7 ~19:48:00]$cat/etc/anacrontab# /etc/anacrontab: configuration file for anacron# See anacron(8) and anacrontab(5) for details.SHELL/bin/shPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot# the maximal random delay added to the base delay of the jobsRANDOM_DELAY45# the jobs will be started during the following hours onlySTART_HOURS_RANGE3-22#period in days delay in minutes job-identifier command15cron.dailynicerun-parts /etc/cron.daily725cron.weeklynicerun-parts /etc/cron.weekly monthly45cron.monthlynicerun-parts /etc/cron.monthly/etc/anacrontab 使用语法NAMEvalue配置 anacrontab。例如START_HOURS_RANGE3-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_RRroundrobin 轮询调度策略。相同优先级的进程轮流获取相同的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_usCPU分配的周期时间单位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资源。nice 值查看ps命令[dengcentos7 ~19:50:00]$ps-onice,cmd$(pgrep systemd)NI CMD0/usr/lib/systemd/systemd --switched-root--system--deserialize220/usr/lib/systemd/systemd-journald0/usr/lib/systemd/systemd-udevd0/usr/lib/systemd/systemd-logind默认情况下子进程将继承父进程的nice值通常为0。[dengcentos7 ~19:51:12]$ md5sum /dev/zero[1]55725[dengcentos7 ~19:51:25]$ps-opid,nice,command$$55725PID NI COMMAND527510-bash557250md5sum /dev/zero# $$ 代表当前终端中运行的 shell 程序 PID结论优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。nice 命令[dengcentos7 ~19:52:00]$nice--helpUsage:nice[OPTION][COMMAND[ARG]...]Run COMMAND with an adjusted niceness,whichaffects process scheduling. With no COMMAND, print the current niceness. Niceness values range from-20(most favorable to the process)to19(least favorable to the process). Mandatory arguments to long options are mandatoryforshort options too. -n,--adjustmentNaddinteger N to the niceness(default10)--helpdisplay thishelpandexit--versionoutput version information andexit示例# nice值默认是10[dengcentos7 ~19:52:30]$nicemd5sum /dev/zero[1]55742[dengcentos7 ~19:52:45]$ps-opid,nice,command PID NI COMMAND527510-bash5574210md5sum /dev/zero557730ps-opid,nice,command普通用户仅允许使用正数的nice值运行程序。# 设置一个负数优先级[dengcentos7 ~19:53:00]$nice-n-2md5sum /dev/zero[2]55782[dengcentos7 ~19:53:15]$ nice: cannotsetniceness: Permission denied[dengcentos7 ~19:53:28]$ps-opid,nice,command55782PID NI COMMAND557820md5sum /dev/zero# 设置一个正数优先级[dengcentos7 ~19:53:40]$nice-n2md5sum /dev/zero[3]55785[dengcentos7 ~19:53:55]$ps-opid,nice,command55785PID NI COMMAND557852md5sum /dev/zerorenice 命令[dengcentos7 ~19:54:10]$renice--helpUsage:renice[-n]priority[-p|--pid]pid...renice[-n]priority-g|--pgrppgid...renice[-n]priority-u|--useruser... Options: -g,--pgrpidinterpret argument as process group ID -n,--prioritynumspecify theniceincrement value -p,--pididinterpret argument as process ID(default)-u,--username|idinterpret argument as username or user ID -h,--helpdisplayhelptext andexit-V,--versiondisplay version information andexit修改上面示例中产生的进程的优先级。[dengcentos7 ~19:54:25]$renice-n25578255782(process ID)old priority0, new priority2[dengcentos7 ~19:54:38]$ps-opid,nice,command55782PID NI COMMAND557822md5sum /dev/zero普通用户只能升高进程nice值不能降低。[dengcentos7 ~19:54:50]$renice-n-255782renice: failed tosetpriorityfor55782(process ID): Permission denied[dengcentos7 ~19:55:05]$ps-opid,nice,command55782PID NI COMMAND557822md5sum /dev/zero# 使用root用户调整[dengcentos7 ~19:55:18]$renice-n-25578255782(process ID)old priority2, new priority-2[dengcentos7 ~19:55:30]$renice-n-25578555785(process ID)old priority2, new priority-2[dengcentos7 ~19:55:42]$ps-opid,nice,command5578255785PID NI COMMAND55782-2md5sum /dev/zero55785-2md5sum /dev/zerotop 命令top 界面查看进程CPU使用率55782和55785CPU使用率非常接近因为优先级一致。在该界面中使用r指令设置进程nice值。终止之前创建的3个md5sum进程。[dengcentos7 ~19:56:00]$pkillmd5sum[1]已终止nicemd5sum /dev/zero[2]- 已终止nice-n-2md5sum /dev/zero[3] 已终止nice-n2md5sum /dev/zero实时调度策略chrtchrt命令用于获取和设置实时调度器进程优先级以及更改进程调度器。[dengcentos7 ~19:56:30]$ chrt--helpShow or change the real-time scheduling attributes of a process. Set policy: chrt[options]prioritycommand[arg...]chrt[options]--pidprioritypidGet policy: chrt[options]-ppidPolicy options: -b,--batchsetpolicy to SCHED_BATCH -d,--deadlinesetpolicy to SCHED_DEADLINE -f,--fifosetpolicy to SCHED_FIFO -i,--idlesetpolicy to SCHED_IDLE -o,--othersetpolicy to SCHED_OTHER -r,--rrsetpolicy to SCHED_RR(default)Scheduling options: -R, --reset-on-forksetSCHED_RESET_ON_FORKforFIFO or RR -T, --sched-runtimensruntime parameterforDEADLINE -P, --sched-periodnsperiod parameterforDEADLINE -D, --sched-deadlinensdeadline parameterforDEADLINE Other options: -a, --all-tasks operate on all the tasks(threads)fora given pid -m,--maxshow min and max valid priorities -p,--pidoperate on existing given pid -v,--verbosedisplay status information -h,--helpdisplay thishelpandexit-V,--versionoutput version information andexitFormoredetails see chrt(1).示例# 查看进程优先级范围chrt不能用于调整非实时进程nice值优先级。[dengcentos7 ~19:57:00]$ chrt-mSCHED_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进程[dengcentos7 ~19:57:30]$ chrt-r5md5sum /dev/zero[1]56225[dengcentos7 ~19:57:45]$ps-opid,cls,rtprio,command56225PID CLS RTPRIO COMMAND56225RR5md5sum /dev/zero# 修改进程调度器和优先级[dengcentos7 ~19:58:00]$ chrt-f--pid1056225[dengcentos7 ~19:58:15]$ps-opid,cls,rtprio,command56225PID CLS RTPRIO COMMAND56225FF10md5sum /dev/zero# 修改进程调度器为非实时[dengcentos7 ~19:58:30]$ chrt-o--pid056225[dengcentos7 ~19:58:45]$ps-opid,cls,rtprio,command56225PID CLS RTPRIO COMMAND56225TS - md5sum /dev/zero