news 2026/10/21 2:35:15

重读2005年Linux命令手册:从用户管理到进程排错的现代运维实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
重读2005年Linux命令手册:从用户管理到进程排错的现代运维实践

简介:这是一份以Linux系统管理命令为主线的参考手册,特别适合刚接触命令行的新手以及需要日常维护服务器的运维人员。内容涵盖用户与用户组管理(adduser、groupdel、groupmod)、系统状态查看(date、free、id)、进程与关停机操作(gitps、halt、exit)等基础条目,并延伸至文件权限、网络配置与软件包管理命令,配套目录结构清晰,便于快速定位与按需查阅。压缩包共1个pdf文件,大小约1.46MB,体积小巧,方便保存在手机或电脑中随时进行查阅与参考。目前已有2092人下载学习。借助这份手册,读者可以系统梳理常用命令的使用场景与参数含义,既能作为系统维护时的速查工具,也能用于自学时快速补齐命令盲区,覆盖账号管理、Shell切换、系统时间与内存查看等常用场景,从而提升在Linux下的操作效率。

1. 十六年前整理的老手册,为什么现在还能当 Linux 运维字典用

很多人看到这份 2005 年整理的 Linux 命令手册,第一反应是"这么老的东西还能用吗"。实际上 Linux 命令行的核心语法和工具链,从九十年代到现在几乎没有变过。adduser、ps、kill、crontab、rpm这些命令,今天你在 CentOS 7、Ubuntu 22.04、甚至 WSL 里敲下去,行为和你想象的不会有太大偏差。手册的价值恰恰在于它按"系统管理、系统设置、文档编辑"做了清晰分类,每个命令一行用途、一行参数,遇到想不起来的命令翻一下,比 man 手册的海量输出高效得多。适合两类人:刚入门 Linux 需要一份命令地图的新手,以及日常维护中经常"觉得某个命令存在但想不起全名"的运维。

2. 用户与权限:adduser、passwd、usermod 的现代使用套路

2.1 adduser 和 useradd 不是同一个命令:选型先看发行版

手册把adduser放在系统管理命令的第一个位置,说明它是当时使用频率最高的用户创建命令。但这里有一个延续多年的坑:在 Debian/Ubuntu 系发行版中,adduser是一个友好的 Perl 封装脚本,它会自动创建用户主目录、设置默认 shell、提示设置密码,并且把用户加入users组;而在 Red Hat/CentOS 系发行版中,adduser只是useradd的符号链接,行为完全不同,useradd不会询问任何交互信息。

我一般会先确认发行版再决定用哪条命令。手动创建用户的标准步骤大致如下:

# 在 CentOS/RHEL 上创建用户并一次性完成主目录、shell、用户组设置 useradd -m -d /home/zhangsan -s /bin/bash -G wheel -c "ops engineer" zhangsan # -m:自动创建主目录 # -d:指定主目录路径 # -s:指定登录 shell # -G:附加用户组,多个组用逗号分隔 # -c:用户备注信息,会写入 /etc/passwd 的 GECOS 字段 # 立即设置密码,passwd 会要求输入两次 passwd zhangsan

useradd的-m参数很容易被忽略,很多新手在 CentOS 上直接用useradd zhangsan,结果发现没有/home/zhangsan目录。旧手册里没有强调这一点,因为当时adduser脚本默认行为就是带主目录的。在 Debian 系环境中用adduser时,可以使用--force-badname允许用户名包含大写字母,但一般不建议这么干,保持全小写用户名是行业惯例。

2.2 用户信息查询与身份切换:id、who、su、sudo 的边界

用户创建之后,日常维护最常用的不是创建命令,而是查询和切换。手册里id、who、whoami、su、sudo几条命令看起来都很简单,实际使用时各有适用场景:

  • id显示当前用户的 UID、GID 以及所属的全部附加组,排查权限问题第一件事就敲它;
  • who查看当前登录到系统的所有会话,包括远程登录来源;
  • whoami只输出当前有效用户名,适合写在脚本里做判断;
  • su切换用户身份,但需要输入目标用户的密码;
  • sudo以其他用户身份执行单条命令,只需要验证当前用户自己的密码。

这里最容易出错的是"你有没有权限执行 sudo"。很多系统上sudo是否可用,取决于用户是否在wheel组或/etc/sudoers中有配置。我在创建用户时用-G wheel就是给运维账号提前放行,省得后面临时改sudoers:

# 查看当前用户的完整身份信息 id # 查看当前系统上有谁在登录、从哪里登录 who -u # 临时切换到 root 执行某条命令,用 -c 指定命令 sudo -u root grep "error" /var/log/messages # 注意:sudo -u 后面跟的是执行命令的目标用户,不是当前用户要切换成谁

who -u的-u参数会额外显示空闲时间和 PID,在排查"哪个终端进程占着资源"时很好用。sudo -u和su -有一个重要区别:su -会重新加载目标用户的完整环境变量,而sudo -u保留当前用户的绝大部分环境。如果遇到"我明明切到 root 了,为什么 PATH 不对"的诡异问题,多半是用sudo -u而不是su -。

2.3 批量用户管理的完整闭环:脚本与参数逐个拆解

真实运维场景很少只创建一个用户。给一组新同事开通账号时,我一般会写一个小循环脚本:

#!/bin/bash # 批量创建用户并初始化密码 # 用法: bash batch_add_user.sh userlist.txt USER_LIST="$1" DEFAULT_PASS="Init@$(date +%Y%m)" # 默认密码带上月份,提醒用户尽快改 while IFS= read -r username || [ -n "$username" ]; do # 过滤空行和以#开头的注释行 case "$username" in ''|#*) continue ;; esac # 判断用户是否已存在 if id "$username" &>/dev/null; then echo "[SKIP] $username already exists" continue fi # 创建用户,带主目录、bash shell、加入 dev 组 useradd -m -s /bin/bash -G dev "$username" if [ $? -eq 0 ]; then # 用 chpasswd 一次性设置密码,避免交互等待 echo "$username:$DEFAULT_PASS" | chpasswd # 强制用户下次登录时修改密码 chage -d 0 "$username" echo "[OK] $username created, password expired, change at first login" else echo "[FAIL] $username creation failed" fi done < "$USER_LIST"

脚本里的chage -d 0是关键一行,它把用户密码的"最后修改日期"设为 0,意味着用户下次登录系统会强制要求修改密码。这是新员工账号初始化的行业惯例,可以避免长时间使用已知初始密码带来的安全隐患。IFS= read -r是为了正确处理用户名列表中的空格和反斜杠,|| [ -n "$username" ]处理没有结尾换行的文件。后面如果要删除这批用户,userdel -r username会连同主目录和邮件池一起删,groupdel删除组之前要先确认组内没有主属用户,否则会报cannot remove the primary group。

3. 进程与系统状态:ps、top、free、kill 的正确打开方式

3.1 ps 选项组合:aux 与 -ef 的差异和字段含义

手册里把ps标注为 process status,给出了多个选项组合。实际使用中ps aux和ps -ef是最常见的两种写法,它们显示的信息几乎一样,但选项风格属于两套体系:BSD 风格的aux和 System V 风格的-ef。日常排查问题我用ps aux居多,因为它的输出里 CPU 和内存占用率排序后非常直观:

# 列出所有进程,显示完整命令行 ps aux # 按内存占用率降序,取前 10 个 ps aux --sort=-%mem | head -10 # 只看某个用户的进程 ps -u zhangsan -o pid,ppid,cmd,%cpu,%mem

ps aux输出的第一列 USER 表示进程所有者,PID 是进程号,%CPU 和 %MEM 是瞬时占用率,STAT 是进程状态(R 运行中、S 可中断睡眠、D 不可中断睡眠、Z 僵尸)。这里最需要留意的就是 D 状态和 Z 状态,D 状态进程通常在做磁盘 IO,kill -9都杀不掉;Z 状态是僵尸进程,父进程没有回收子进程的退出状态,大量 Z 状态说明父进程逻辑有泄漏。-o参数用于自定义输出列,写监控脚本时很有用,可以把 PID 和命令提取出来做自动化处理。

3.2 top 和 free:实时监控内存要学会看缓存行

top是交互式实时监控工具,手册里单独列了一条。进去后按M按内存排序、按P按 CPU 排序、按q退出。我通常第一眼不看每个进程的 CPU,而是看顶部KiB Mem一行的total、used、free、buff/cache四项。Linux 会把空闲内存用作文件缓存,所以free值小并不代表内存不够,真正要看的是available这一列(如果有的话)。

# 显示内存使用情况,-h 转成易读单位 free -h # 实测输出类似: # total used free shared buff/cache available # Mem: 7.6G 2.1G 1.2G 211M 4.3G 5.0G

free -h输出里的available是内核估算的"在不触发 swap 的情况下还能分配给新应用的内存量",它把 reclaimable cache 算进去了。如果available持续很低而buff/cache很高,说明系统内存压力大,这时才需要排查是哪个进程吃内存。查看每个进程实际占用可以用:

# 按内存倒序查看进程占用的物理内存 top -b -n 1 -o %MEM | head -25

top -b -n 1的非交互模式可以用于脚本采集。手册里出现的procinfo现在大多发行版已经不装这个包了,功能基本被top和cat /proc/meminfo取代。另外pstree按进程树方式展示父子关系,追踪"这个进程是谁拉起来的"时比 ps 更直观:

# 显示进程树,指定 PID 只看某个进程及其子进程 pstree -p 1234

3.3 kill 信号与优先级:kill -9 不是第一选择

kill命令的误区非常大。不少新手遇到进程卡住就kill -9,其实这是下下策。kill可以发送多种信号,常见的有TERM(15)、KILL(9)、HUP(1)、INT(2)。TERM是礼貌地请进程自行退出,进程有机会清理临时文件和关闭连接;KILL由内核直接终止进程,进程没有任何机会善后,可能留下孤儿进程或未写盘的缓存。

# 查看所有信号编号 kill -l # 先发 TERM 请进程退出 kill -TERM 1234 # 等 5 秒没退出再升级 sleep 5 && kill -KILL 1234 # 给进程发送 HUP 信号,很多守护进程会重新加载配置 kill -HUP $(cat /var/run/nginx.pid)

HUP信号经常用于让 nginx、ssh 这类守护进程重读配置文件而不中断服务,这是最优雅的热加载方式。优先级调整方面,nice用于启动时指定优先级,renice用于调整运行中进程的优先级。数值范围 -20 到 19,数值越小优先级越高:

# 以更低优先级启动一个编译任务,避免抢占线上服务 CPU nice -n 10 make -j4 # 把已运行的某个编译进程优先级调低 renice 15 -p 2345

普通用户只能把 nice 值调大(降低优先级),调小需要 root 权限。renice后可以用ps -o nice,pid,cmd确认效果。手册里的gitps已经基本没人用了,它是 GNU Interactive Tools 自带的一个进程查看器,功能被top和htop完全覆盖。这类"老命令消失"的现象在第二章也出现过,旧手册里部分命令的新系统兼容性要特别留意。

4. 系统设置与排错:crontab、alias、rpm 的使用边界与常见坑

4.1 定时任务与 Shell 环境:crontab 的 PATH 陷阱

crontab是系统设置命令里最重要的一条,它负责周期性地执行任务。手册对它的描述很简洁,但实际配置中翻车点极多。最大的坑是环境变量不继承:cron 执行命令时使用的是精简环境,PATH只有/usr/bin:/bin,你在交互 Shell 里能用python或docker,cron 里直接写命令名就可能找不到。

# 编辑当前用户的定时任务 crontab -e # 每条任务有 5 个时间字段:分 时 日 月 周 # 每天凌晨 3:30 备份 /data 目录 30 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 # 重启 cron 服务 systemctl restart crond # 在 Ubuntu 上是 cron 服务名:systemctl restart cron

脚本里我建议使用绝对路径,或者在脚本开头显式声明PATH="/usr/local/bin:/usr/bin:/bin"。日志重定向>> /var/log/backup.log 2>&1是必要的,否则 cron 任务出错时你只能靠系统邮件被动发现,而多数服务器根本没配邮件服务。现在很多发行版已经把 cron 的日志收到 journald 里,排查时可以journalctl -u crond -f实时看任务执行记录。

4.2 ulimit、alias、export:Shell 环境变量的三板斧

ulimit是系统资源限制命令,生产环境经常用到。默认情况下单个进程可以打开 1024 个文件描述符,高并发服务必须调大。有两种设置范围:软限制可以随时调小或凭权限调大,硬限制只能调小。我一般在/etc/security/limits.conf里改,而不是在 shell 里临时设置,因为重启后会失效:

# 查看当前文件描述符限制 ulimit -n # 临时把软限制调到 65535 ulimit -n 65535 # 注意:硬限制不够大时,调软限制会报 permission denied # 永久修改,追加到 limits.conf echo "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf

alias是给命令起别名的机制,export是导出环境变量。这两个在手册里都在系统设置分类下,实际使用频率很高。我习惯把一些固定的运维组合命令写成 alias:

# 常用别名 alias ll='ls -alh --color=auto' alias df='df -h' alias free='free -h' alias grep='grep --color=auto' # 临时生效的别名只对当前 shell 有效 # 要永久生效,写入 ~/.bashrc 或 /etc/profile.d/ 下的脚本里

export有一个经典误用:export PATH=/usr/local/bin:$PATH这个写法没问题,但如果写反了(export PATH=$PATH:/usr/local/bin)也不会出错,真正危险的是有的人在脚本里写了export PATH=/usr/local/bin,把原有 PATH 全部覆盖,之后所有命令都找不到了。判断一个变量是否需要 export,看它要不要传递给子进程:MY_VAR="hello"只对当前 shell 可见,export MY_VAR="hello"子进程就能继承。

4.3 系统管理命令的新旧更替与兼容性评估

手册列出的一些命令在今天已经发生了很大变化。halt、reboot、shutdown在 systemd 系统上都是systemctl的符号链接或兼容包装;rpm在 Debian 系被dpkg取代,在 RHEL 系被dnf封装;insmod、rmmod、lsmod、modprobe这一组模块命令仍然存在,但日常不怎么手动操作,由systemd-modules-load或kmod代劳;chkconfig完全被systemctl enable/disable取代。fwhois、rwho、rlogin、rsh这类远程查询/登录命令因为安全协议原因在大多数新系统上已经不存在或需要单独安装 inetutils 包。screen还在但更多人用tmux。

阅读这种老手册时要有一个意识:命令名和基础选项不变,但每个发行版的实现和周边生态变了。验证一个命令在当前系统是否存在,用command -v 命令名,没有输出就是不在 PATH 里。

4.4 避坑:老手册在新系统上的五个常见翻车点

现象一:useradd创建的用户无法登录,提示No directory, logging in with HOME=/。原因是useradd没有加-m,主目录没创建。解决方法:useradd -m或用mkhomedir_helper补建。

现象二:crontab -e保存时报语法错误,任务不执行。原因是时间字段数对不上,普通任务必须五个字段,@daily这类宏掉除外。解决:逐字段确认分时日月周,周字段里 0 和 7 都表示周日,不要同时写。

现象三:dd if=/dev/zero of=/tmp/test bs=1M count=100创建大文件后,free -h显示 used 飙升。原因是被页缓存吃掉了,不是内存泄漏。解决:看 available 列而不是 used 列,必要时sync && echo 3 > /proc/sys/vm/drop_caches清缓存。

现象四:kill -9杀掉 Java 进程后,端口仍然被占用。原因是进程被强杀前没有释放 socket,TIME_WAIT 状态持续约 60 秒。解决:ss -tanp | grep 端口确认状态,等待或调整net.ipv4.tcp_tw_reuse。

现象五:modprobe报Module not found。原因是不带路径的模块名只在系统的modules.dep索引里查找,手动编译的内核模块需要先depmod -a更新依赖索引。解决:depmod -a && modprobe 模块名。

这些坑在手册里基本不会提到,因为它们属于发行版演进和内核行为层面的知识,必须通过实践积累。老手册能给你的是一张完整的命令地图,但地图上的路况要自己跑一遍才知道。

5. 把这份手册变成自己的命令速查系统:三招让老资料焕发新价值

5.1 用 apropos 和 man 补齐手册缺失的命令索引

手册的局限是只覆盖到 2005 年的命令集,新工具如journalctl、systemctl、ip(替代 ifconfig)、ss(替代 netstat)都不在其中。遇到不认识的命令名,我现在更常用apropos按关键词搜索命令,而不是翻整本手册:

# 搜索描述中包含 "system log" 的命令 apropos "system log" # 等价写法 man -k,两者输出一样 man -k "journal"

apropos的检索依赖 whatis 数据库,第一次使用可能需要mandb或makewhatis初始化。这个方法比盲目翻手册高效得多,找到命令名后man 命令名看详细用法,遇到复杂参数组合再回到手册看有没有同类命令可以替代。

5.2 建立自己的命令笔记模板:一条命令记四个要素

我建议把这份手册当作底稿,在它的分类基础上做减法,只记录自己实际用过的命令。每一条记四个要素:命令全名、核心参数、使用场景、踩坑记录。比如:

命令:scp 场景:跨机器拷贝文件 常用:scp file user@host:/path 坑:scp 是基于 ssh 的,目标端要开 sshd;断点续传不支持,大文件优先考虑 rsync

这样积累三个月后,你自己的笔记会比任何现成手册都实用。手册里的分类方式本身很好——系统管理、系统设置、文档编辑,完全可以沿用,只是每类下面增删条目。

5.3 把高频命令固化成 alias 和函数:减少重复输入和错误

建立速查系统的最终形态,是把常用命令组合变成可复用的alias和 shell 函数。alias 适合简单替换,函数适合多步骤操作:

# 高频 alias alias myip='hostname -I | awk "{print \$1}"' alias ports='ss -tlnp' alias memtop='ps aux --sort=-%mem | head -15' # shell 函数:查看日志的最新 N 行并持续追踪 tailf() { if [ -z "$1" ]; then echo "Usage: tailf <logfile>" return 1 fi tail -n 50 -f "$1" } # 函数:快速创建备份目录,带时间戳 bak() { mkdir -p /backup/$(date +%Y%m%d) cp -av "$1" /backup/$(date +%Y%m%d)/ }

shell 函数里的$1是第一个参数,$0是函数名本身。把这些写进~/.bashrc,每次登录自动加载。这样手册上那些命令通过 alias 固化进日常操作习惯,才真正形成了自己的工具箱。

我自己的习惯是每年花半天时间,把当年实际用过的命令从手册目录里过一遍,已经淘汰的标记淘汰,新增的命令补充进去。这个习惯坚持几年后,那份二手整理的 PDF 就变成了一本属于自己的一手运维笔记。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 18:38:49

Spring依赖注入三种方式详解:构造器、Setter与字段注入的选型与坑

Spring IoC 系列写到第四篇&#xff0c;前几篇主要聊了容器的基本模型、Bean 的创建流程和装配规则&#xff0c;这次专门把 DI&#xff08;依赖注入&#xff09;的三种落地方式讲透。构造器注入、Setter 注入、字段注入&#xff0c;这三个名字你肯定都听过&#xff0c;但什么时…

作者头像 李华
网站建设 2026/10/19 16:27:33

AirLLM分层加载实战:小显存跑大模型的原理与调优

1. 项目缘起与核心定位1.1 这个工具到底解决什么问题第一次看到 airllm 这个名字&#xff0c;我脑子里蹦出来的画面是“让大模型在空气里跑”——听起来很玄&#xff0c;但实际用下来&#xff0c;它的核心思路其实非常朴素&#xff1a;用时间换空间。你手头只有一张显存小得可怜…

作者头像 李华
网站建设 2026/10/20 0:49:35

Selenium Web自动化测试实战:环境搭建到稳定用例设计

1. 为什么我建议用Selenium做Web自动化测试做Web测试这件事&#xff0c;如果你还在靠纯手工点页面、截图、填表格&#xff0c;那大概率已经被反复回归的测试任务折磨过了。每次发版前要过一遍核心流程&#xff0c;点几十个按钮&#xff0c;核对十几处文案&#xff0c;稍微漏掉一…

作者头像 李华
网站建设 2026/10/21 0:28:01

Matplotlib从入门到进阶:搞懂绘图逻辑,做出专业级图表

做数据分析和可视化这几年&#xff0c;我最大的一个感受是&#xff1a;Matplotlib 这玩意&#xff0c;入门容易&#xff0c;画好难。很多人一开始都是plt.plot(x, y)完事&#xff0c;能出图就觉得自己会了&#xff0c;但图一放到报告里、拿到评审会上&#xff0c;就露怯。坐标轴…

作者头像 李华
网站建设 2026/10/18 10:20:29

Spring Boot面试92题怎么准备:掌握自动配置和请求链路核心

简介&#xff1a;Spring Boot面试题&#xff08;92题&#xff09;是一份面向Java开发者与后端求职者的高频考题合集&#xff0c;围绕Spring Boot如何简化传统Spring工程搭建这一主线&#xff0c;梳理了自动配置、Starters启动器、可执行Jar包、内嵌Servlet容器、应用监控等核心…

作者头像 李华
网站建设 2026/10/20 3:25:35

TStarBots1:轻量级星际争霸AI研究框架解析

1. 项目概述&#xff1a;这不是游戏外挂&#xff0c;而是一套可复现的AI竞技研究框架“腾讯星际争霸 TStarBots1”这个标题一出现&#xff0c;很多人第一反应是“哦&#xff0c;腾讯又出游戏AI了&#xff1f;”——但如果你真这么想&#xff0c;就错过了它最硬核的价值。它不是…

作者头像 李华