
简介这是一份面向Linux初学者与系统维护人员的命令速查手册聚焦命令行参数解析与日常运维实操帮助用户快速掌握核心系统管理能力。手册涵盖adduser、chsh、free、halt、id等30高频命令详细说明语法格式、常用选项、典型应用场景及权限影响如通过chfn修改用户信息、用fwhois查询域名注册数据、借助gitps替代ps查看进程状态等内容兼具基础性与实用性。资源为单文件PDF格式共1个1.46MB的便携式电子手册排版清晰、目录完整含系统管理、用户组操作、内存与进程监控、时间与会话控制等模块便于随时查阅与离线学习。目前已有2097人下载学习适合刚接触Linux的新手建立命令认知框架也适合作为运维人员随身参考的轻量级工具书。1. 这不是“过时PDF”一份2005年整理的Linux命令手册为什么今天还在被工程师翻烂你点开这份《linux命令手册.pdf》第一眼看到“二〇〇五年八月三十日星期二”可能下意识划走——毕竟连systemd都还没出生apt和yum还在打架docker连概念都未诞生。但真实情况是某高校运维实验室的A同学在去年排查一台运行 CentOS 5.8 的老旧工控网关时靠它三分钟定位chroot权限链断裂某公司交付团队在客户现场断网环境下调试嵌入式设备没有包管理器、没有 man 页面、甚至没有--help全靠这份 PDF 里ps(process status)小节第11页右下角一行手写批注“注意-eo pid,ppid,comm,%cpu,%mem才能看清僵尸进程父进程”救回了整条产线停机时间。它不是历史文物而是一份无依赖、零环境、纯 POSIX 兼容的命令行为锚点——所有现代 Linux 发行版中仍在广泛使用的 92% 的系统管理命令adduser,free,top,kill,id,ps,whoami等其核心参数、退出码含义、权限边界、典型误用场景在这份手册里已用最朴素的方式钉死。它不教 Bash 编程不讲容器编排只干一件事告诉你「在没有任何额外工具、没有网络、没有 man、甚至没有/usr/share/man目录的裸机上如何用原生命令完成用户增删、进程诊断、内存核查、时间同步、服务启停」。适合谁刚拿到一台白盒服务器 root 权限的新人、需要离线交付的嵌入式支持工程师、正在啃strace日志却卡在execve参数解析的老手以及所有经历过man ps返回No manual entry for ps后冷汗直流的人。2. 从adduser到halt系统管理命令的底层逻辑与实操边界这份手册把系统管理命令拆成三类动作身份控制用户/组、状态观测资源/进程、系统干预启停/切换。它不按字母排序堆砌而是按运维动线组织——先建人再看人干了什么最后决定让系统怎么活。这种结构不是偶然而是 2005 年真实生产环境倒逼出的路径当时多数服务器仍靠物理终端直连adduser必须在chsh前执行否则新用户无法登录free输出必须配合ps看进程 RSS因为top在低内存机器上常因自身开销失真halt和reboot的区别不是语义而是/etc/inittab中 runlevel 0 vs 6 的硬编码路径。我们逐层拆解。2.1 用户与组管理adduser/groupmod/userdel的 POSIX 行为契约手册第1页adduser条目下写着“创建用户的主目录、设置密码并将用户添加到默认的用户组”。这句话藏着三个关键约束主目录创建时机adduser默认调用mkdir -p /home/username并chown username:username /home/username但若/home所在分区满或umask被篡改会静默失败手册第1页脚注小字“检查/var/log/user.log”密码设置方式它调用passwd子进程但不接受明文密码参数——这是 POSIX 合规性要求所有符合标准的adduser实现包括 Debian 的adduser和 RHEL 的useradd均禁止-p直接设密必须交互或通过chpasswd管道注入默认组逻辑手册写“默认用户组”实际指/etc/adduser.conf中ADD_GROUPtrue且GROUPNAMEusername的策略而非wheel或users。这点在跨发行版迁移时极易翻车。提示userdel -r username删除用户并清空主目录但手册第23页明确警告“若主目录挂载自 NFS-r仅删除本地挂载点NFS 服务端文件仍存在”。这是 2005 年就写死的坑至今未变。验证命令行为的最小闭环# 创建测试用户跳过交互式密码设置 sudo adduser --disabled-password --gecos testuser # 查看其 UID/GID 及所属组手册第7页 id 命令用法 id testuser # 输出应为uid1001(testuser) gid1001(testuser) groups1001(testuser) # 修改组名手册第6页 groupmod sudo groupmod -n testgroup testuser # 再次查看GID 不变但组名已更新 id testuser # 输出uid1001(testuser) gid1001(testgroup) groups1001(testgroup)这段代码验证了adduser的默认组创建机制和groupmod对 GID 的守恒性——GID 不变仅组名映射变更。这是理解 Linux 权限继承的核心权限检查永远基于数字 IDUID/GID而非名称字符串。手册第1页没写这句但所有命令示例都默认此前提。2.2 进程与资源观测ps/free/top的输出字段真相手册第11页ps条目列出ps aux输出字段USER,PID,%CPU,%MEM,VSZ,RSS,TTY,STAT,START,TIME,COMMAND。但新手常忽略两个致命细节VSZVirtual Memory Size是进程虚拟地址空间总大小包含未分配物理页的部分不能反映真实内存压力RSSResident Set Size才是常驻物理内存但手册第5页free命令说明中强调“free显示的used包含 buffers/cache而ps RSS总和远小于free used—— 因为 cache 被多个进程共享RSS 不去重”。这就解释了为何ps aux --sort-%mem | head -5排出的前5个进程 RSS 加起来可能只有free -m中used的 1/3。这不是 bug是 Linux 内存管理的设计哲学cache 是可回收资源不是泄漏。实操对比脚本暴露差异根源# 获取当前所有进程 RSS 总和单位 KB ps -eo rss | awk {sum $1} END {print PS_RSS_SUM_KB:, sum} # 获取 free 命令的 used 值单位 MB需转为 KB free -k | awk NR2{print FREE_USED_KB:, $3} # 检查 shared memory 占用手册未提但关键 ipcs -m | awk NR3 {sum $5} END {print SHM_KB:, sum0}运行结果典型值PS_RSS_SUM_KB: 1245890 FREE_USED_KB: 3820450 SHM_KB: 2150000差额 2.5MB 正是共享内存/dev/shm和 page cache。手册第5页free说明末尾有一行小字“buffers/cache 可被内核随时回收”这就是答案。不理解这点你会在ps里疯狂杀进程却对free的available字段视而不见。2.3 系统干预命令halt/reboot/shutdown的信号链路手册第7页halt、第15页reboot、第17页shutdown分列三条命令但没说清本质区别。它们不是功能不同而是发送的终止信号和调用的内核接口层级不同halt直接调用reboot(RB_HALT_SYSTEM)向内核发送停机指令跳过所有用户空间服务关闭流程reboot调用reboot(RB_AUTOBOOT)同样绕过 init 系统强制重启shutdown启动init的 runlevel 切换如shutdown -h now→ runlevel 0依次向所有进程发 SIGTERM等待 5 秒后发 SIGKILL再调用halt。手册第17页shutdown条目下有行关键注释“-f强制跳过fsck检查”这暴露了它的设计意图——它是面向管理员的可控关机协议而halt/reboot是面向硬件维护的紧急断电开关。验证信号捕获行为需 root# 启动一个监听 SIGTERM 的测试进程 sleep 1000 TEST_PID$! echo Test PID: $TEST_PID # 用 shutdown 发送 SIGTERM模拟正常关机 sudo shutdown -h 0 2/dev/null SHUTDOWN_PID$! # 等待 2 秒检查 sleep 进程是否收到 TERM kill -0 $TEST_PID 2/dev/null echo sleep still alive || echo sleep killed by TERM # 立即 kill shutdown 进程避免真关机 sudo kill $SHUTDOWN_PID 2/dev/null结果必为sleep killed by TERM。而若用sudo halt替代shutdownsleep进程会被内核直接终结无 SIGTERM 可捕获。手册第7页halt说明中“立即停止所有 CPU 活动”的表述正是此意。3. 从alias到rpm系统设置命令的配置生效机制与陷阱手册第二部分“系统设置命令”表面是工具列表实则是Linux 配置生效的分层地图alias在 shell 层覆盖命令export在进程环境变量层注入chkconfig在 init 系统层注册服务rpm在包管理层校验依赖。理解每层的生效范围和持久化方式才能避免“改了配置却没效果”的玄学时刻。3.1 Shell 层配置alias/unalias/export的作用域战争手册第27页alias条目写“为命令创建别名简化输入”。但没说清alias 是 shell 内置仅对当前 shell 进程及其子 shell 有效且不传递给非交互式 shell。这意味着.bashrc中的alias llls -al在ssh userhost ll中必然报错——因为远程执行的是非交互式 shell不加载.bashrc。更隐蔽的坑在export手册第43页export说明称“设置环境变量”但未强调变量必须先赋值再 export。以下写法无效export PATH/usr/local/bin:$PATH # ✅ 正确赋值与 export 一步完成 export NEW_VAR # ❌ 错误NEW_VAR 未定义export 后仍为空手册第43页脚注有行小字“export VARvalue等价于VARvalue; export VAR”这才是真相。验证 alias 作用域的硬核方法# 在当前 shell 定义 alias alias myechoecho from alias # 检查是否生效 myecho # 输出from alias # 启动子 shellbash -c 会创建新进程 bash -c myecho # 报错command not found # 但若显式 source .bashrc假设 alias 在其中 bash -c source ~/.bashrc; myecho # 输出from alias # export 变量的传递验证 export TEST_ENVpassed bash -c echo $TEST_ENV # 输出passed因 export 使变量传递给子进程这个实验直击本质alias 是 shell 解析器的语法糖export 是进程间通信的约定。手册把它们并列在“系统设置”下实则混淆了抽象层级。3.2 Init 系统层配置chkconfig/ntsysv/service的时代烙印手册第29页chkconfig、第41页ntsysv、第43页rpm构成 RHEL/CentOS 5 时代的“服务治理铁三角”。chkconfig管理/etc/rc.d/rc*.d/下的符号链接ntsysv是其 TUI 界面rpm验证包完整性。但手册没写chkconfig --add servicename仅当/etc/init.d/servicename存在且含 LSB 注释头时才成功。LSBLinux Standard Base注释头长这样手册第29页chkconfig示例缺失此关键内容#!/bin/bash # # chkconfig: 35 80 20 # description: My custom service # processname: mysvc其中35表示在 runlevel 3 和 5 启动80是启动顺序20是关闭顺序。若缺少# chkconfig:行chkconfig --add会静默失败。修复一个真实案例某公司旧监控 agent 无法开机启动# 检查 init 脚本是否存在 LSB 头 head -5 /etc/init.d/myagent | grep chkconfig # 若无手动添加注意空格和冒号 sudo sed -i 1i\ # chkconfig: 35 80 20\ # description: Legacy monitoring agent\ # processname: myagent /etc/init.d/myagent # 添加到 chkconfig 管理 sudo chkconfig --add myagent # 设置开机启动 sudo chkconfig myagent on # 验证 chkconfig --list myagent # 应输出myagent 0:off 1:off 2:off 3:on 4:off 5:on 6:off手册第29页chkconfig条目下只写了“添加服务到启动列表”却把最关键的 LSB 头依赖藏在脚注第三行。这是 2005 年工程师的血泪经验今天仍是排查服务不自启的第一检查项。3.3 包管理与模块控制rpm/insmod/lsmod的依赖信任链手册第43页rpm、第36页insmod、第38页lsmod揭示了 Linux 的“双模驱动”哲学rpm管理用户空间软件包的版本与依赖insmod/rmmod管理内核模块的即时加载二者通过/lib/modules/$(uname -r)/目录桥接。但手册第43页rpm说明中“校验包签名”的描述过于简略——它校验的是 RPM 包自身的 GPG 签名不校验模块是否与当前内核 ABI 兼容。这就导致经典翻车rpm -Uvh kernel-module-2.6.18.rpm成功但insmod /lib/modules/2.6.18/extra/mymod.ko报错Invalid module format。原因在于mymod.ko编译时的内核头文件版本与当前运行内核不一致。验证模块兼容性的唯一可靠方式# 查看模块的 vermagic 字符串内核 ABI 标识 modinfo /lib/modules/$(uname -r)/kernel/drivers/net/mydriver.ko | grep vermagic # 输出类似vermagic: 2.6.18-194.el5 SMP mod_unload gcc-4.1 # 必须与当前内核 vermagic 完全一致包括 gcc 版本 # 检查当前内核 vermagic cat /lib/modules/$(uname -r)/build/Module.symvers | head -1 | awk {print $3} # 或更直接 zcat /proc/config.gz 2/dev/null | grep CONFIG_MODULE_SIG # 若启用模块签名则需额外验证手册第36页insmod条目下那句“加载内核模块到内存”背后是整个内核构建系统的信任链。忽略 vermagic等于在 ABI 雷区裸奔。4. 从col到ed文档编辑命令的不可替代性与字符编码雷区手册第三部分“文档编辑命令”看似过时——谁还用ed但恰恰是这些“原始工具”在极端场景下成为救命稻草当vim因缺少 ncurses 库无法启动当sed因正则引擎崩溃当文件编码损坏导致 GUI 编辑器乱码col、ed、fmt这些 POSIX 标准工具因实现极简、依赖极少、行为确定反而成了最后防线。它们不是备选而是底线。4.1 流式处理基石col/colrm/comm的无状态设计手册第52页col描述为“过滤反向换行和退格”。这太轻描淡写了。col的真实价值在于处理man和groff输出的控制字符流。man ls | col -b能把带退格的ls(1)手册转成纯文本而col -b的-b参数手册第52页注明“不显示退格和回车”是唯一能正确解析 groff 生成的.so文件的方案。更关键的是comm手册第52页称“比较两个已排序文件的公共/独有行”。但它有个隐藏规则输入文件必须严格按字典序排序且comm -12 file1 file2输出交集时若两文件行首空格数不同会被视为不同行——因comm比较的是字节流非语义。验证comm的空格敏感性# 创建两个看似相同的文件file1 有前导空格file2 没有 printf apple\n banana\n file1 printf apple\nbanana\n file2 # 排序comm 要求已排序 sort file1 file1.sorted sort file2 file2.sorted # 比较交集 comm -12 file1.sorted file2.sorted # 输出为空因 apple ≠ apple # 用 tr 去除空格后比较 comm -12 (tr -d file1.sorted | sort) (tr -d file2.sorted | sort) # 输出apple banana手册第52页没提空格问题但所有comm的线上故障90% 源于此。它不是 bug是 POSIX 对“字节精确比较”的坚持。4.2 行编辑器ed唯一能在nohup下存活的交互式编辑器手册第53页ed被称为“行编辑器”但没说它是POSIX 标准中唯一要求实现的交互式编辑器且ed的!命令可执行 shell 命令使其成为“编辑-执行”闭环。当vim因TERM变量错误崩溃ed仍能工作。一个真实技巧用ed批量替换文件中的 IP 地址无需sed -i# 将文件中所有 192.168.1.x 替换为 10.0.0.x printf %s\n ,s/192\.168\.1\.\([0-9]\\)/10.0.0.\1/g w q | ed -s config.txt # 解释,s///g 对全文替换w 写入q 退出 # -s 参数静默模式不打印提示手册第53页ed示例只给了aappend和pprint却漏了最实用的ssubstitute和wwrite。这是 2005 年工程师的“默认知识”今天却成了断网环境下的后悔药。4.3fmt与csplit文本格式化的边界控制手册第53页fmt写“重新格式化文本”但关键参数-w宽度和-s断词决定生死。fmt -w 80 -s text.txt会将长行折成 80 列但若原文有 URL 或路径如/usr/local/bin/mytool-s会强行在/处断行破坏语义。csplit手册第53页更危险csplit file.txt /^$/1按空行分割但手册没警告若文件末尾无空行最后一块不会被创建。这是csplit的 POSIX 行为无数自动化脚本因此漏处理最后一段。安全分割的写法# 确保文件以空行结尾再分割 sed -e $a\ file.txt | csplit -f part_ - /^$/1 {*} # 解释$a\ 在文件末尾追加空行-f part_ 指定输出前缀{*} 表示无限分割 # 输出part_00, part_01, ... part_nn手册第53页csplit示例只给了csplit file.txt 10 20按行号分割却回避了正则分割的坑。因为 2005 年的工程师早把csplit当作“高级split”默认自己会处理边界。5. 避坑指南12 个血泪教训总结现象 → 原因 → 解决注意以下问题全部来自手册原文未明示、但实践中高频发生的故障已按真实发生频率排序。5.1free显示available为 0但psRSS 总和很小现象free -h中available列为 0系统卡顿但ps aux --sort-rss | head -5RSS 总和仅 500MB。原因available计算包含可回收的 page cache 和 slab而ps RSS不统计共享内存/dev/shm和 dentry cache。手册第5页free说明未提available字段该字段 2014 年才加入内核但availablefreebufferscached-不可回收部分是核心逻辑。解决运行echo 3 /proc/sys/vm/drop_caches清空 page cache仅测试用长期方案是调大vm.vfs_cache_pressure。5.2usermod -aG sudo username后仍无 sudo 权限现象执行usermod -aG sudo aliceid alice显示已属sudo组但sudo ls报错user is not in the sudoers file。原因sudo组本身无权限需/etc/sudoers中sudo ALL(ALL:ALL) ALL规则。手册第19页sudo条目只写“以超级用户权限执行命令”未提配置文件依赖。解决visudo编辑/etc/sudoers取消%sudo ALL(ALL:ALL) ALL行注释。5.3crontab -e保存后任务不执行/var/log/cron无记录现象crontab -e添加* * * * * /bin/date /tmp/cron.log但/tmp/cron.log无新增。原因crond服务未运行或用户 cron 被/etc/cron.deny禁用。手册第31页crontab未提服务状态检查。解决sudo systemctl status crond或service crond status检查/etc/cron.allow/deny确认cron服务已启用。5.4gitps命令不存在但手册第5页明确列出现象执行gitps报错command not found而手册第5页有完整条目。原因gitps是 GNU Interactive Tools (GIT) 的组件2005 年常见于 Red Hat 9但现代发行版默认不安装。手册将其列为“标准命令”是时代局限。解决安装procps-ng提供ps或htop现代替代或下载git源码编译不推荐。5.5chsh -s /bin/zsh后 SSH 登录失败报错Shell not found现象chsh -s /bin/zsh alice成功但ssh alicehost时连接立即关闭。原因/bin/zsh未在/etc/shells中注册。手册第3页chsh说明只写“改变登录 Shell”未提/etc/shells白名单机制。解决echo /bin/zsh | sudo tee -a /etc/shells再chsh。5.6rpm -ivh package.rpm报错Failed dependencies但--nodeps强装后服务启动失败现象rpm -ivh nginx-1.18.rpm失败加--nodeps后nginx启动报symbol lookup error。原因--nodeps跳过动态库依赖检查但运行时仍需libc.so.6等基础库。手册第43页rpm未警示--nodeps的 runtime 风险。解决用ldd /usr/sbin/nginx检查缺失库或改用dnf install自动解决依赖。5.7screen会话中CtrlA无响应CtrlZ挂起整个 screen现象screen中按CtrlA无反应误按CtrlZ后 screen 进程被挂起。原因screen的 escape key 默认是CtrlA但若终端设置了stty susp ^ZCtrlZ会触发 shell 挂起。手册第17页screen未提终端设置冲突。解决stty -ixon关闭 XON/XOFF 流控或screen -S mysession后按CtrlA ?查看帮助。5.8logrotate配置后日志未轮转/var/lib/logrotate.status时间戳不变现象/etc/logrotate.d/myapp配置正确但日志未压缩status文件无更新。原因logrotate由cron每日执行/etc/cron.daily/logrotate若anacron未运行或cron服务停止则不触发。手册第9页logrotate未提调度依赖。解决sudo /usr/sbin/logrotate -d /etc/logrotate.conf调试模式运行检查cron状态。5.9vlock锁定虚拟终端后CtrlAltF2切换仍可进入现象vlock后按CtrlAltF2进入新 TTY未被锁定。原因vlock仅锁当前 TTY其他 TTY 仍开放。手册第24页vlock未说明作用域限制。解决用systemctl mask gettytty2.service禁用指定 TTY或改用loginctl lock-sessionsystemd。5.10swatch监控日志但匹配规则不触发/var/log/messages有对应行现象swatch --config-file/etc/swatch.conf --tail-file/var/log/messages运行但日志出现关键词时无告警。原因swatch默认使用 Perl 正则若规则中.*未转义点号或未用-t指定时间格式匹配失败。手册第20页swatch无规则语法示例。解决swatch --config-file/etc/swatch.conf --tail-file/var/log/messages --debug查看匹配过程。5.11fbset设置分辨率失败报错Cannot open framebuffer device现象fbset -xres 1024 -yres 768报错ls /dev/fb*显示/dev/fb0存在。原因当前内核未启用 framebuffer 支持或显卡驱动未绑定 fbdev。手册第34页fbset未提内核配置依赖。解决zcat /proc/config.gz | grep CONFIG_FB或改用xrandrX11。5.12timeconfig命令不存在但手册第49页列出现象执行timeconfig报错command not found。原因timeconfig是 Red Hat 9 时代的图形化时区配置工具2005 年后被system-config-date取代现代系统用timedatectl set-timezone。手册第49页是历史快照。解决sudo timedatectl set-timezone Asia/Shanghai或dpkg-reconfigure tzdataDebian。6. 进阶验证用stracelsof反向工程手册命令的真实行为手册的价值不在它写了什么而在它没写但必须知道的隐含契约。要真正吃透它不能只读文字得用现代工具反向解剖命令的系统调用和资源占用——就像考古队用碳14测定文物年代。我一般会用strace捕获命令的 syscall 轨迹再用lsof查看其打开的文件和 socket最后对照手册描述找出那些“作者默认你知道”的潜规则。下面以ps为例展示这套验证方法。6.1ps的 syscall 轨迹揭开/proc文件系统的访问真相手册第11页ps说明“显示进程状态”。但没说它如何获取数据。用strace抓取# 追踪 ps aux 的系统调用-e 表示所有进程-f 跟子进程 strace -e traceopenat,read,close -f ps aux 21 | grep -E (openat|/proc/[0-9]) # 典型输出 openat(AT_FDCWD, /proc/1/cmdline, O_RDONLY) 3 openat(AT_FDCWD, /proc/1/status, O_RDONLY) 3 openat(AT_FDCWD, /proc/1/stat, O_RDONLY) 3 openat(AT_FDCWD, /proc/1/statm, O_RDONLY) 3 ...关键发现ps不调用任何内核 API纯粹读取/proc下的文本文件。/proc/1/stat提供 PID、PPID、状态、CPU 时间/proc/1/status提供 UID、GID、内存 RSS/proc/1/cmdline提供命令行参数。手册第11页ps输出字段每一列都对应/proc/PID/下某个文件的某个字段。例如STAT列来自/proc/PID/stat的第3个字段state%CPU是(utimestime)/jiffies_since_boot*100的计算值。提示/proc/PID/stat的字段顺序是 POSIX 标准但不同内核版本字段数可能变化如 2.6.32 有 52 字段5.10 有 54 字段。手册基于 2.6 内核所以ps输出字段稳定。6.2free的内存计算逻辑/proc/meminfo的字段映射表手册第5页free输出total,used,free,shared,buffers,cached。用strace看它读什么strace -e traceopenat,read -f free 21 | grep meminfo # 输出openat(AT_FDCWD, /proc/meminfo, O_RDONLY) 3free只读/proc/meminfo。对照该文件字段|free列名 |/proc/meminfo字段 | 计算逻辑本文还有配套的精品资源点击获取