当前位置:首页>Linux>linux系统的进程优先级调高

linux系统的进程优先级调高

  • 2026-10-02 16:51:04
linux系统的进程优先级调高

在Linux系统中,进程优先级通过nice值和实时优先级控制,普通进程调整nice值即可实现优先级高低调整,nice值越小,进程优先级越高(范围-20~`19,默认0`);root用户可设置负nice值,普通用户仅能设置≥当前nice值的正数。

一、核心规则

  1. 1. nice值范围:-20(最高优先级) → 0(默认) → 19(最低优先级)
  2. 2. 权限限制:普通用户只能提高nice值(降低优先级),root用户可任意调整(包括设置负nice值,提高优先级)
  3. 3. 实时进程:优先级高于所有普通进程(范围1~`99`),需root权限,一般用于对延迟敏感的场景(如工业控制),非必要不使用。

二、方法1:启动进程时直接设置优先级(推荐)

用nice命令启动进程,直接指定nice值,语法:

# 格式:nice -n [nice值] 进程命令
nice -n -5 python test.py  # root用户,设置nice=-5(提高优先级)
nice -n 10 ./start.sh      # 普通/root用户,设置nice=10(降低优先级)
  • • 简写:nice -5 python test.py 等价于 nice -n -5 python test.py(负数值可省略n)。

三、方法2:调整已运行的进程优先级(常用)

用renice命令修改已运行进程的nice值,需指定PID(进程ID),语法:

1. 先查询进程PID(必做)

ps -ef | grep 进程名  # 模糊查询,如ps -ef | grep python
pgrep 进程名          # 精准查询PID,如pgrep python
top                   # 实时查看进程PID和当前nice值(NI列)

2. 用renice调整优先级

# 格式:renice [nice值] -p [PID]
renice -5 -p 12345    # root用户,将PID=12345的进程nice值设为-5(提高优先级)
renice 8 -p 67890     # 所有用户,将PID=67890的进程nice值设为8(降低优先级)

# 批量调整:给同一用户的所有进程设优先级
renice -3 -u root     # root用户,将root所有进程nice值设为-3

3. 验证调整结果

ps -o pid,ni,cmd -p 12345  # 查看指定PID的nice值(NI列)
top -p 12345               # 实时验证(NI列显示调整后的值)

四、方法3:top交互模式快速调整(可视化)

  1. 1. 执行top进入实时进程监控界面
  2. 2. 按r键,提示输入要调整的PID,回车
  3. 3. 提示输入新的nice值(如-5),回车即可完成调整
  4. 4. 按q退出top界面。

五、实时进程优先级调整(高级,慎用)

实时进程优先级远高于普通进程(包括系统进程),滥用会导致系统无响应,仅适用于对延迟要求极高的场景,需root权限:

1. 启动实时进程

chrt -f 50 python test.py  # -f表示FIFO调度策略,50为实时优先级(1~99)

2. 修改已运行进程为实时优先级

chrt -f -p 60 12345  # 将PID=12345的进程设为FIFO策略,实时优先级60

3. 恢复为普通进程

chrt -o -p 0 12345   # -o表示普通调度策略,恢复为默认nice=0

六、注意事项(避坑关键)

  1. 1. 权限问题:普通用户执行renice -5 -p 12345会报错,需切换root(sudo -i)后操作。
  2. 2. 不要过度调高优先级:将关键进程(如数据库、服务程序)设为-20可能抢占系统核心进程资源,导致系统卡顿。
  3. 3. 子进程继承优先级:用nice启动的父进程,其创建的子进程会继承父进程的nice值。
  4. 4. 优先级仅影响CPU调度:进程卡顿若因IO(磁盘/网络)导致,调整CPU优先级无效果。
  5. 5. 容器/虚拟机中注意:部分容器环境会限制nice值调整,需宿主机授权。

七、常用组合命令

  1. 1. 查找进程并一键调整优先级:
# 查找python进程的PID并设为nice=-3(root)
renice -3 -p $(pgrep python)
  1. 2. 查看系统中高优先级进程(nice≤-5):
ps -eo pid,ni,cmd | awk '$2 <= -5'

Linux 进程优先级批量调整脚本

这个脚本专为批量调整指定进程名的nice值设计,支持root/普通用户(自动做权限校验)、批量PID匹配、调整后结果验证,还会做安全校验(避免误改系统核心进程),开箱即用,适配所有主流Linux发行版(CentOS/Ubuntu/Debian等)。

脚本特点

  1. 1. 自动校验权限:普通用户仅能设置≥0的nice值,root可设置-20~19全范围
  2. 2. 安全过滤:默认排除系统核心进程(如systemd/kernel/sshd等),避免误改导致系统异常
  3. 3. 批量匹配:支持进程名模糊匹配(如输入python会匹配所有python相关进程)
  4. 4. 结果验证:调整后自动查询并展示所有进程的原nice值/新nice值,直观确认效果
  5. 5. 友好提示:全程中文交互,错误场景(无匹配进程/参数非法/权限不足)有明确提示
  6. 6. 防重复操作:自动过滤已为目标nice值的进程,避免无意义调整

完整脚本代码

新建脚本文件(如batch_nice.sh),复制以下内容,保存后赋予执行权限即可使用:

#!/bin/bash
# 脚本名称:Linux进程优先级批量调整脚本
# 适用场景:批量调整指定进程名的nice值,支持root/普通用户,带安全校验和结果验证
# 使用方式:sudo bash batch_nice.sh (root权限)或 bash batch_nice.sh (普通用户)
set -euo pipefail

# ===================== 配置区(可根据需要修改)=====================
# 系统核心进程,禁止调整(模糊匹配),避免误改导致系统异常
FORBIDDEN_PROCS=("systemd""kernel""sshd""bash""sh""top""ps""renice""sudo")
# nice值合法范围
NICE_MIN=-20
NICE_MAX=19
# ======================================================================

# 颜色输出函数(增强交互性)
red_echo() { echo -e "\033[31m$1\033[0m"; }
green_echo() { echo -e "\033[32m$1\033[0m"; }
yellow_echo() { echo -e "\033[33m$1\033[0m"; }
blue_echo() { echo -e "\033[34m$1\033[0m"; }

# 脚本欢迎信息
echo"==================== Linux进程优先级批量调整工具 ===================="
echo"说明:1. nice值越小优先级越高,范围[$NICE_MIN, $NICE_MAX],默认0"
echo"      2. 普通用户仅能设置≥0的nice值,root用户可设置全范围"
echo"      3. 系统核心进程已被禁止调整,避免误操作"
echo"======================================================================"
echo

# 第一步:获取用户输入(进程名+目标nice值)
read -p "请输入要调整的进程名(支持模糊匹配,如python):" TARGET_PROC
if [[ -z "$TARGET_PROC" ]]; then
    red_echo "错误:进程名不能为空!"
exit 1
fi

read -p "请输入目标nice值[$NICE_MIN, $NICE_MAX]:" TARGET_NICE
# 校验nice值是否为整数
if ! [[ "$TARGET_NICE" =~ ^-?[0-9]+$ ]]; then
    red_echo "错误:nice值必须是整数!"
exit 1
fi
# 校验nice值是否在合法范围
if [[ "$TARGET_NICE" -lt "$NICE_MIN" || "$TARGET_NICE" -gt "$NICE_MAX" ]]; then
    red_echo "错误:nice值必须在[$NICE_MIN, $NICE_MAX]范围内!"
exit 1
fi

# 第二步:权限校验+普通用户限制
USER_ID=$(id -u)
if [[ "$USER_ID" -eq 0 ]]; then
    blue_echo "当前为ROOT用户,可设置[$NICE_MIN, $NICE_MAX]全范围nice值"
else
    blue_echo "当前为普通用户,仅能设置≥0的nice值"
# 普通用户禁止设置负nice值
if [[ "$TARGET_NICE" -lt 0 ]]; then
        red_echo "错误:普通用户无权限设置负nice值,请切换root(sudo -i)后操作!"
exit 1
fi
fi
echo

# 第三步:查询匹配的进程PID,并过滤禁止调整的进程+去重
blue_echo "正在查询匹配进程[$TARGET_PROC],并过滤系统核心进程..."
# 查询进程:PID、原nice值、进程命令,排除当前脚本进程,去重
RAW_PIDS=$(ps -eo pid,ni,cmd --no-headers | grep -i "$TARGET_PROC" | grep -v "batch_nice.sh" | grep -v "grep")
if [[ -z "$RAW_PIDS" ]]; then
    red_echo "未找到匹配进程[$TARGET_PROC],脚本退出!"
exit 0
fi

# 过滤禁止调整的进程,提取有效PID和原nice值
VALID_PROCS=()
whileread -r PID NI CMD; do
# 跳过空PID
if [[ -z "$PID" ]]; thencontinue; fi
# 跳过系统核心进程
    FORBIDDEN=0
for proc in"${FORBIDDEN_PROCS[@]}"; do
if [[ "$CMD" =~ $proc ]]; then
            FORBIDDEN=1
break
fi
done
if [[ "$FORBIDDEN" -eq 1 ]]; then
        yellow_echo "跳过系统核心进程:PID=$PID,CMD=$CMD"
continue
fi
# 跳过已为目标nice值的进程
if [[ "$NI" -eq "$TARGET_NICE" ]]; then
        yellow_echo "跳过无需调整进程:PID=$PID(当前nice=$NI,目标nice=$TARGET_NICE)"
continue
fi
# 加入有效进程列表
    VALID_PROCS+=("$PID$NI$CMD")
done <<< "$RAW_PIDS"

# 检查是否有有效进程需要调整
if [[ ${
#VALID_PROCS[@]} -eq 0 ]]; then
    green_echo "无需要调整的进程,脚本执行完成!"
exit 0
fi

# 第四步:展示待调整进程,确认后执行
echo
blue_echo "========== 以下为待调整的有效进程(共${#VALID_PROCS[@]}个)=========="
printf"%-8s %-8s %s\n""PID""原NICE值""进程命令"
for proc in"${VALID_PROCS[@]}"; do
printf"%-8s %-8s %s\n"$proc
done
echo
read -p "确认是否调整以上进程的nice值为$TARGET_NICE?(y/n,默认n):" CONFIRM
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
    red_echo "用户取消操作,脚本退出!"
exit 0
fi

# 第五步:批量调整nice值
echo
blue_echo "开始批量调整进程优先级,目标nice值=$TARGET_NICE..."
for proc in"${VALID_PROCS[@]}"; do
    PID=$(echo"$proc" | awk '{print $1}')
# 执行renice调整,忽略已无权限/进程已退出的情况
if renice "$TARGET_NICE" -p "$PID" >/dev/null 2>&1; then
        green_echo "成功调整:PID=$PID → nice值=$TARGET_NICE"
else
        red_echo "调整失败:PID=$PID(进程已退出/无权限)"
fi
done

# 第六步:验证调整结果并展示
echo
blue_echo "========== 调整结果验证 =========="
printf"%-8s %-8s %-8s %s\n""PID""原NICE值""新NICE值""进程命令"
for proc in"${VALID_PROCS[@]}"; do
    PID=$(echo"$proc" | awk '{print $1}')
    OLD_NI=$(echo"$proc" | awk '{print $2}')
    CMD=$(echo"$proc" | awk '{$1=$2=""; print substr($0,3)}')
# 查询调整后的实际nice值
    NEW_NI=$(ps -o ni --no-headers -p "$PID" 2>/dev/null || echo"进程已退出")
printf"%-8s %-8s %-8s %s\n""$PID""$OLD_NI""$NEW_NI""$CMD"
done

# 脚本结束
echo
green_echo "==================== 脚本执行完成!===================="
yellow_echo "注意:1. 优先级仅影响CPU调度,IO型卡顿调整无效果;2. 不要将进程设为-20避免抢占系统资源。"

脚本使用步骤

1. 创建并保存脚本

# 新建脚本文件
vim batch_nice.sh
# 复制上面的完整代码,粘贴后保存退出(vim中按ESC,输入:wq回车)

2. 赋予执行权限

chmod +x batch_nice.sh

3. 执行脚本

方式1:普通用户执行(仅能设置≥0的nice值)

bash batch_nice.sh

方式2:root用户执行(可设置-20~19全范围,推荐调整高优先级时使用)

# 直接root执行
sudo bash batch_nice.sh
# 或先切root再执行
sudo -i
bash /你的脚本路径/batch_nice.sh

脚本使用示例(root用户)

==================== Linux进程优先级批量调整工具 ====================
说明:1. nice值越小优先级越高,范围[-20, 19],默认0
      2. 普通用户仅能设置≥0的nice值,root用户可设置全范围
      3. 系统核心进程已被禁止调整,避免误操作
======================================================================

请输入要调整的进程名(支持模糊匹配,如python):python
请输入目标nice值[-20, 19]:-5

当前为ROOT用户,可设置[-20, 19]全范围nice值

正在查询匹配进程[python],并过滤系统核心进程...

========== 以下为待调整的有效进程(共2个)==========
PID      原NICE值  进程命令
12345    0         python test1.py
67890    0         python test2.py

确认是否调整以上进程的nice值为-5?(y/n,默认n):y

开始批量调整进程优先级,目标nice值=-5...
成功调整:PID=12345 → nice值=-5
成功调整:PID=67890 → nice值=-5

========== 调整结果验证 ==========
PID      原NICE值  新NICE值  进程命令
12345    0         -5        python test1.py
67890    0         -5        python test2.py

==================== 脚本执行完成!====================
注意:1. 优先级仅影响CPU调度,IO型卡顿调整无效果;2. 不要将进程设为-20避免抢占系统资源。

自定义修改说明

如果需要调整禁止调整的系统核心进程、修改nice值范围,直接修改脚本中配置区的内容即可,注释已标注清楚,无需修改核心逻辑:

# 系统核心进程,禁止调整(模糊匹配),添加/删除即可
FORBIDDEN_PROCS=("systemd""kernel""sshd""bash""sh""top""ps""renice""sudo")
# nice值合法范围,一般无需修改
NICE_MIN=-20
NICE_MAX=19

常见问题解决

  1. 1. 提示“未找到匹配进程”:检查进程名是否正确,进程是否正在运行(可先用ps -ef | grep 进程名确认)
  2. 2. 普通用户调整负nice值报错:切换root用户(sudo -i)后重新执行脚本
  3. 3. 个别进程调整失败:大概率是进程已退出,或该进程受容器/虚拟机权限限制(需宿主机root调整)
  4. 4. 执行脚本提示权限不足:重新执行chmod +x batch_nice.sh赋予执行权限

总结

  1. 1. 该脚本实现批量进程优先级调整,核心基于renice命令,增加了权限、安全、参数三重校验,避免新手误操作;
  2. 2. 支持root/普通用户差异化使用,自动过滤系统核心进程和无需调整的进程,兼顾实用性和安全性;
  3. 3. 全程中文交互+结果验证,无需记忆复杂命令,直接输入进程名和目标nice值即可完成批量操作。

最新文章

随机文章