最常用方式是sysctl 参数名,如sysctl net.core.somaxconn输出net.core.somaxconn = 128;脚本中取纯数值用-n选项;也可直接cat /proc/sys/xxx读取,路径中点号替换为斜杠;sysctl --show-config仅显示被显式修改过的持久化参数;配置文件修改后需执行sysctl --system才生效。

直接用 sysctl 查单个参数值
最常用也最直观的方式就是 sysctl 加参数名,比如想看 TCP 连接队列上限:sysctl net.core.somaxconn。它会输出类似 net.core.somaxconn = 128 的结果,等号右边就是当前生效值。
如果要在脚本里取纯数字,加 -n 参数:sysctl -n net.core.somaxconn,只输出 128,不带键名和空格。
- 参数名拼错或不存在时,会报
No such file or directory - 某些参数(如
kernel.random.uuid)读一次就变,不适合用-n做稳定判断 -
sysctl读的是运行时内核状态,不是配置文件里的“写死值”
绕过命令,直接 cat /proc/sys/xxx
/proc/sys/ 是内核参数的虚拟文件系统映射,路径里的点号换成斜杠就行。比如 net.ipv4.ip_forward 对应 /proc/sys/net/ipv4/ip_forward,执行:cat /proc/sys/net/ipv4/ip_forward 就能拿到值。
这种方式不依赖 sysctl 命令本身,适合最小化环境或 shell 脚本中做条件判断(比如 if [ "$(cat /proc/sys/net/ipv4/ip_forward)" = "1" ]; then ...)。
- 路径必须严格匹配,
/proc/sys/net/ipv4/下没有tcp_tw_recycle—— 因为它从 Linux 4.12 起已被移除 - 部分只读参数(如
kernel.version)可读但不可写,echo 1 > ...会提示Permission denied - 文件内容是纯文本,末尾可能带换行符,脚本里建议用
$(cat ... | tr -d '\n')清理
查哪些参数被人工改过:用 sysctl --show-config
sysctl --show-config 不是列出全部参数,而是只显示那些“被显式设置过”的——也就是不在内核默认值上的项。它帮你快速区分哪些是系统原生行为、哪些是管理员动过的。
比如你刚往 /etc/sysctl.d/99-custom.conf 里写了 vm.swappiness = 10,执行该命令就能立刻看到这行,而不会混在几百个默认值里。
- 输出格式是
参数名 = 值,和配置文件一致,可直接用于备份或迁移 - 它不反映临时修改(
sysctl -w),只体现持久化配置的实际加载结果 - 若没改过任何参数,命令可能无输出,不代表出错
别把 /etc/sysctl.conf 当成当前值来源
很多人误以为 cat /etc/sysctl.conf 就能看到当前生效值,其实不是。这个文件只是“下次重启时的期望值”,是否生效取决于有没有执行过 sudo sysctl --system 或 sudo sysctl -p。
真正决定当前值的是内核运行时状态,sysctl 和 /proc/sys/ 读的都是这个状态;而配置文件只是“源码”,需要主动加载才起作用。
- 修改了
/etc/sysctl.conf却没运行sysctl --system?那改动完全没生效 -
sysctl --system会按顺序加载/etc/sysctl.conf和/etc/sysctl.d/*.conf,后者优先级更高 - 用
systemctl status systemd-sysctl.service可确认上次加载是否成功,尤其在 systemd 系统上
sysctl 或 /proc/sys/ 确认当前值,再决定要不要改;改完别忘了验证——有些参数(比如 net.ipv4.tcp_mem)格式敏感,输错会导致内核拒绝写入,但错误可能不明显。


















