Linux进程管理
Linux进程管理一、Linux计划任务管理1.一次性计划任务介绍一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。atd服务Linux 系统中at提供一次性计划任务功能。at不是一个单独的工具包括系统后台进程atd和一系列与后台进程atd交互的命令例如at atq等等。#安装工具[rootsever ~16:43:53]# yum install at#确认atd服务开机自启动[rootsever ~16:45:09]# systemctl status atd● atd.service - Job spooling tools Loaded: loaded(/usr/lib/systemd/system/atd.service;enabled;vendor preset: enabled)Active: active(running)since 二2026-05-1916:45:09 CST;2s ago Main PID:1432(atd)CGroup: /system.slice/atd.service └─1432 /usr/sbin/atd-f5月1916:45:09 sever.bgy.cloud systemd[1]: Started Job spooling tools.at命令1.编辑#示例 5分钟后执行[rootsever ~16:45:11]# at now 5 minutesatechohello world/tmp/hello.log atEOTjob1at Tue May1916:59:002026at命令从标准输入中读取要执行的命令。手动输入命令时按ctrlD完成输入。如果输入错误使用ctrlbackspace删除。输入完成按ctrld完成。上面的字符’就是按ctrld自动出现的。对于大量的命令或者错字敏感的命令可以通过重定向和-f选项从脚本中读取例如[rootsever ~17:01:11]# vim first.sh[rootsever ~17:01:38]# cat first.sh#!/bin/bashdate/tmp/suibian.logechohello myscript/tmp/suibian.log[rootsever ~17:00:49]# at now 5 minutes first.shjob2at Tue May1917:06:002026[rootsever ~17:01:03]# at now first.shjob3at Tue May1917:01:002026[rootsever ~17:02:11]# cat /tmp/suibian.log2026年 05月19日 星期二17:01:11 CST hello myscript可以接的参数now 5 hoursteatime tomorrow (teatime 16:00)noon 4 days(noon 12:00)5 pm august 3 2016时间定义参考文档 /usr/share/doc/at/timespec2.atl/at -l查看任务队列#两条命令等价[rootsever ~17:06:29]# at -l4Tue May1918:56:002026a root5Tue May1919:06:002026a root[rootsever ~17:06:32]# atq4Tue May1918:56:002026a root5Tue May1919:06:002026a rootatd提供26个队列a到z排的越后优先级越低。使用at命令使用-q选项指定队列[rootsever ~17:06:34]# at -q b now 5 minutes first.shjob6at Tue May1917:13:002026[rootsever ~17:08:12]# atq4Tue May1918:56:002026a root5Tue May1919:06:002026a root6Tue May1917:13:002026b root3.at -c#查看任务详细信息[rootsever ~17:08:15]# at -c 4#!/bin/sh# atrun uid0 gid0# mail root 0umask22XDG_SESSION_ID1;exportXDG_SESSION_IDHOSTNAMEsever.bgy.cloud;exportHOSTNAME4.at -d/-r 或 atrm#三条命令等价[rootsever ~17:09:13]# atrm 4[rootsever ~17:10:12]# at -d 5[rootsever ~17:10:22]# at -r 6[rootsever ~17:10:28]# atq2.用户周期性任务周期性任务定时、循环重复执行由crond服务管控用户级crontab命令每个用户独立任务#默认开机自启[rootsever ~17:10:31]# systemctl status crond● crond.service - Command Scheduler Loaded: loaded(/usr/lib/systemd/system/crond.service;enabled;vendor preset: enabled)Active: active(running)since 二2026-05-1916:39:46 CST;35min ago Main PID:699(crond)CGroup: /system.slice/crond.service └─699 /usr/sbin/crond-n5月1916:39:46 sever.bgy.cloud systemd[1]: Started Command Scheduler.5月1916:39:46 sever.bgy.cloud crond[699]:(CRON)INFO(RANDOM_DELAY will be scaled with fa...d.)5月1916:39:46 sever.bgy.cloud crond[699]:(CRON)INFO(running with inotify support)Hint: Some lines were ellipsized, use-lto showinfull.1.核心命令命令作用crontab -e编辑当前用户定时任务crontab -l查看当前用户所有定时crontab -r删除当前用户全部定时任务crontab -u 用户名 -l查看指定用户定时crontab -u 用户名 -e编辑指定用户定时仅 root 可用2.时间格式分 时 日 月 周 执行命令* * * * * command取值范围分0-59时0-23日1-31月1-12周0~6 0 和 7 都是周日特殊符号*代表每*/n每隔 n 单位x-y连续范围x,y离散多个时间3.演示#使时间格式更加清晰可辨[rootsever ~17:21:12]# export EDITORvim[rootsever ~17:24:48]# crontab -ecrontab: installing newcrontab[rootsever ~17:25:55]# crontab -l0922*date/tmp/date.log * * * * *date/tmp/date.log[rootsever ~17:26:08]# tail -f /tmp/date.log2026年 05月19日 星期二17:26:01 CST#删除所有周期性任务[rootsever ~17:26:10]# crontab -r[rootsever ~17:27:19]# crontab -lnocrontabforroot#root用户可以使用参数 -u username 管理其他用户周期性作业[rootsever ~17:27:26]# crontab -u bgy -enocrontabforbgy - using an empty one该用户没设置过定时 crontab: installing newcrontab[rootsever ~17:30:35]# crontab -u bgy -l* * * * *date/home/bgy/date.log[rootsever ~17:31:21]# crontab -u bgy -r[rootsever ~17:31:48]# crontab -u bgy -lnocrontabforbgy#还可以使用crontab filename 命令从文件 filename 中读取的作业并替换当前所有作业。3.系统周期性计划任务系统级全局生效多用于系统运维、日志切割、系统维护root管理**格式*分 时 日 月 周 运行用户 执行命令 * * * * root /usr/bin/xxx3.1/etc/crontab#crond的配置文件比crontab命令定义的jobs多一个区域在最后一个时间和# command之间指明使用哪个账户执行job。[rootsever ~18:19:56]# 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 executed3.2 /etc/cron.d系统周期性作业应始终在/etc/cron.d/目录中创建自定义crontab文件防止cronie更新后覆盖/etc/crontab文件。其他应用也会将系统周期性作业存放在该目录。/etc/cron.d/0hourly定义了每小时要执行的任务run-parts /etc/cron.hourly。作用每小时将/etc/cron.hourly目录下所有脚本按顺序执行一次。[rootsever ~18:21:21]# ls /etc/cron.d0hourly[rootsever ~18:25:06]# cat /etc/cron.d/0hourly# Run the hourly jobsSHELL/bin/bashPATH/sbin:/bin:/usr/sbin:/usr/binMAILTOroot 01 * * * * root run-parts /etc/cron.hourly3.3 /etc/anacrontab/etc/anacrontab定义了每天、每周、每个月要运行的任务。周期性执行任务目录每天要执行的任务目录/etc/cron.daily每周要执行的任务目录/etc/cron.weekly每月要执行的任务目录/etc/cron.monthly[rootsever ~18:25:22]# 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进程调度管理1.进程调度器Linux系统看起来可以同时执行多个进程多个进程轮流使用CPU。**内核使用进程调度器决定如何分配CPU时间。**为了更好地运行进程调度器必须平衡不同的条件快速决定下个执行的进程确保进程获得公平的CPU时间按时间片轮转10-20ms为1个时间片 按优先级调度允许高优先级进程获取更多的共享CPU时间低优先级进程获取更少的共享CPU时间。进程调度器可粗略分为两类实时调度器系统中重要的进程由实时调度器调度获得CPU能力强。非实时调度器系统中大部分进程由非实时调度器调度获得CPU能力弱。实时调度器管重要进程抢 CPU能力强非实时调度器管普通进程抢 CPU能力弱非实时调度器非实时调度器支持的调度策略:SCHED_NORMAL标准的轮询方式时间共享调度也称为SCHED_OTHER。SCHED_BATCH针对批量方式执行的进程策略。不像SCHED_NORMAL频繁竞争任务可以长时间运行。SCHED_IDLE用于执行非常低的优先级应用。使用SCHED_IDLE调度策略运行的进程比nice 19运行的进程优先级还低。实时调度器实时调度器支持的调度策略SCHED_RRroundrobin 轮询调度策略。相同优先级的进程轮流获取相同的CPU时间。SCHED_FIFO先入先出调度策略。被分配到的CPU时间的进程会一直运行直到被IO阻塞也称为sched_yield会被高优先级进程抢占。2.管理进程优先级1.非实时调度策略1.nice 命令Linux 通过nice 值决定进程抢占 CPU 能力[rootsever ~18:39:07]# nice --help用法nice[选项][命令[参数]...]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)--help显示此帮助信息并退出--version显示版本信息并退出 注意您的shell 内含自己的nice 程序版本它会覆盖这里所提及的相应 版本。请查阅您的shell 文档获知它所支持的选项。 GNU coreutils online help:http://www.gnu.org/software/coreutils/请向http://translationproject.org/team/zh_CN.html报告nice 的翻译错误 要获取完整文档请运行info coreutilsnice invocation示例#nice值默认为10[rootsever ~18:39:10]# nice md5sum /dev/zero [1]1975[rootsever ~18:40:13]# ps -o pid,nice,commandPID NI COMMAND13590-bash197510md5sum /dev/zero19760ps-opid,nice,command#普通用户仅允许使用正数的nice值运行程序[bgysever ~18:43:51]$nice-n-2md5sum /dev/zero[1]2005[bgysever ~18:44:08]$ nice: 无法设置优先级: 权限不够renice命令修改已经正在运行进程的nice优先级[rootsever ~18:40:26]# renice --help用法renice[-n]优先级[-p|--pid]pid...renice[-n]优先级-g|--pgrppgid...renice[-n]优先级-u|--user用户... 选项 -g,--pgrpid将参数解释为进程组 ID -n,--priority数字指定nice增加值 -p,--pidid将参数解释为进程 ID(默认)-u,--username|id将参数解释为用户名或用户 ID -h,--help显示帮助文本并退出 -V,--version显示版本信息并退出 更多信息请参阅 renice(1)。#修改[rootsever ~ 18:46:11]# ps -o pid,nice,commandPID NI COMMAND13590-bash197510md5sum /dev/zero20310ps-opid,nice,command[rootsever ~18:46:11]# ps -o pid,nice,commandPID NI COMMAND13590-bash197510md5sum /dev/zero20310ps-opid,nice,command[rootsever ~18:46:45]# renice -n 2 19751975(进程 ID)旧优先级为10新优先级为2[rootsever ~18:46:50]# ps -o pid,nice,commandPID NI COMMAND13590-bash19752md5sum /dev/zero20340ps-opid,nice,command#普通用户只能升高不能降低[bgysever ~18:48:23]$ps-opid,nice,command PID NI COMMAND19800-bash20050md5sum /dev/zero203710md5sum /dev/zero20380ps-opid,nice,command[bgysever ~18:48:30]$renice-n22037renice: 设置2037的优先级失败(进程 ID): 权限不够2.top命令top-18:50:38 up2:10,2users, load average:2.88,1.95,0.97Tasks:121total,4running,117sleeping,0stopped,0zombie %Cpu(s):46.3us,3.0sy,50.7ni,0.0id,0.0wa,0.0hi,0.0si,0.0st KiB Mem:4026124total,3625340free,164304used,236480buff/cache KiB Swap:2097148total,2097148free,0used.3633272avail Mem PIDUSERPR NI VIRT RES SHR S %CPU %MEM TIME COMMAND2005bgy200108068616524R95.70.06:21.67 md5sum1975root222108068620524R85.70.09:58.45 md5sum2037bgy3010108068620524R18.70.00:29.31 md5sum1root20012552440562628S0.00.10:00.80 systemd2root200000S0.00.00:00.00 kthreadd4root0-20000S0.00.00:00.00 kworker/0:0H5root200000S0.00.00:00.36 kworker/u256:06root200000S0.00.00:00.03 ksoftirqd/07root rt0000S0.00.00:00.02 migration/08root200000S0.00.00:00.00 rcu_bh9root200000S0.00.00:00.60 rcu_sched在此界面中使用r指令设置进程nice值2.实时调度策略chrt命令用于获取和设置实时调度器进程优先级以及更改进程调度器。普通用户不能设置实时优先级必须root才能使用chrt设置 FIFO/RR[rootsever ~18:51:26]# 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,--help显示此帮助并退出 -V,--version输出版本信息并退出 更多信息请参阅 chrt(1)。示例#查看优先级范围chrt不能用于调整非实时进程nice值优先级。[rootsever ~18:56:15]# 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进程[rootsever ~19:00:56]# chrt -r 5 md5sum /dev/zero [1]2084[rootsever ~19:01:20]# ps -o pid,cls,rtprio,command 2084PID CLS RTPRIO COMMAND2084RR5md5sum /dev/zero# 修改进程调度器和优先级[rootsever ~19:01:52]# chrt -f --pid 10 2084[rootsever ~19:02:24]# ps -o pid,cls,rtprio,command 2084PID CLS RTPRIO COMMAND2084FF10md5sum /dev/zero# 修改进程调度器为非实时[rootsever ~19:06:26]# ps -o pid,cls,rtprio,command 2084PID CLS RTPRIO COMMAND2084TS - md5sum /dev/zero