系列 · Linux · 第 1 篇

Linux(一):使用基础

Linux 入门导览:理解多用户与文件级权限模型,看懂 FHS 目录结构与发行版谱系,掌握登录后第一时间要敲的那批最常用的命令。

很多人觉得 Linux 难,但其实难点不在命令本身,而在于是否对整个系统有一个清晰的“全局观”——为什么它能在服务器领域占据主导地位?多用户设计和文件权限管理带来了哪些实际好处?从 Debian 系切换到 Red Hat 系时,底层逻辑有哪些变化?通过 SSH 登录到服务器后,最初的十分钟该做什么?这篇文章是整个 Linux 系列的入门指南,旨在帮助你快速建立核心心智模型,涵盖设计理念、主要发行版的区别以及 FHS 目录结构的基础知识。接着,我们会带你熟悉那些几乎每小时都要用上十几次的常用命令:cd ls pwdcp mv rm mkdircat less head tailfind grep,以及管道、重定向、 SSH 操作,还有权限管理和进程查看的基本方法。每个部分都力求简洁明了,深入内容则会留给后续的专题文章,如文件权限、磁盘管理、用户管理、服务管理、进程管理、包管理和高级文件操作等。

Linux(一):使用基础 — 章节概览图


为什么是 Linux,它为什么长成这样#

Linux 的许多特性初看可能让人觉得“怪异”,但其实它们都可以追溯到三个核心设计理念:天生为多用户环境设计、将文件作为通用接口、更倾向于自动化而非手动操作

  • 高度开放,灵活定制: 无论是内核还是 init 系统,几乎所有组件都可以替换、重新编译或裁剪。一个仅有 5MB 的 Alpine 容器和一个占用 12GB 的 Oracle Linux 安装包,都自称是 Linux。
  • 稳定到让人忘记它的存在: 生产环境的服务器常常几年都不重启一次。如果你在一台运行多年的机器上执行 uptime,看到 up 412 days 这样的输出,完全不用惊讶,这再正常不过了。
  • 包管理器是安装软件的主要途径。 你几乎不会去下载 .exe 文件。aptdnfpacmanzypper 这些工具不仅能自动解决依赖问题,还能校验签名,并通过一条命令升级整个系统。
  • 一切皆文件: 磁盘设备存放在 /dev,进程信息在 /proc 中,内核参数则可以通过写入 /sys 来调整。无论是查看 CPU 信息还是调节键盘灯亮度,用的都是同样的 cat> 操作。
  • 命令行优先,图形界面可选: 虽然桌面环境(如 GNOME、KDE)确实存在,但在服务器上,管理员通常通过 SSH 使用纯文本操作——这种设计让脚本编写和远程管理变得异常简单。

主流发行版家族一览#

尽管 Linux 发行版种类繁多,但绝大多数都可以追溯到少数几个“祖先”。最快区分它们的方法就是看它们使用什么包管理器。

Linux 发行版谱系

  • Debian / Ubuntu 系列 —— apt。学习曲线平缓,文档丰富,云镜像默认选择。如果没有特殊需求,直接选 Ubuntu LTS 就对了。
  • Red Hat / RHEL / CentOS / Rocky / Alma / Fedora 系列 —— yum(CentOS 7 及更早版本)或 dnf(8 及更高版本)。企业级首选。自从 CentOS Linux 在 2021 年被砍掉后,Rocky LinuxAlmaLinux 成为了与 RHEL 二进制兼容的替代品。
  • SUSE / openSUSE 系列 —— zypper。在欧洲企业和 SAP 场景中较为常见。
  • Arch / Manjaro 系列 —— pacman。采用滚动更新模式,软件最新,但需要你主动查阅 wiki。
  • 独立派 —— Gentoo (所有软件都需要自己编译)、 Alpine (基于 musl,仅 5MB,容器场景的宠儿)、 NixOS (声明式配置)、 Void (不依赖 systemd)。

在云端,还需要考虑厂商推荐的发行版: AWS 推荐 Amazon Linux,阿里云推荐 Alibaba Cloud Linux,两者都是针对各自平台优化过的 RHEL 衍生版本。

三大核心理念解释一切#

多用户、多任务#

Linux 设计之初就考虑到了多用户同时登录的场景,无论是通过 SSH 还是本地 TTY,每个用户都可以并行运行多个进程。内核必须隔离每个用户的 CPU 时间、内存、文件和网络套接字。这也是权限模型如此严格的原因——如果不限制,任何用户都能读取别人的敏感数据,甚至终止别人的进程。

以文件为核心的权限体系#

在 Linux 中,每个文件(包括目录,它是一种特殊文件)都有三组权限:ownergroupothers,每组分别对应三个权限位:读 (r)写 (w)执行 (x)。以下是一个典型的权限字符串解析:

1
2
3
4
5
6
-rwxr-xr-x  1 alice  devs   2048  Jan 15 09:30  deploy.sh
^^^^^^^^^^
||||||||||+-- others:r-x      可读、可执行
|||||||+----- group: r-x      可读、可执行
||||+-------- owner: rwx      可读、可写、可执行
+------------ 类型:  -        普通文件(d=目录,l=软链接)

有一个权限组合你需要牢记:rw-------(八进制表示为 600),这是 SSH 私钥唯一允许的权限。如果权限设置不符合这一要求, SSH 客户端会拒绝使用该私钥。

更深入的内容,比如 chmod/chown 的用法、八进制与符号表示法的区别、 SUID/SGID/sticky bit、 ACL 和 umask,可以参考 《Linux 文件权限》 专题。这里的介绍足以帮助你理解 ls -l 的输出。

一切皆文件#

普通文件、目录、设备、进程、内核状态、管道、 socket——这些看似不同的东西,在 Linux 中都统一暴露了 read()write() 接口。这种设计让同一套工具可以在各种场景下通用:

1
2
3
4
cat /proc/cpuinfo                                       # 查看 CPU 型号、核心数和特性标志
cat /proc/meminfo | head -5                             # 查看内存总量等基本信息
echo 1 > /sys/class/leds/input1::capslock/brightness    # 打开键盘大写锁定灯
cat /dev/urandom | head -c 16 | xxd                     # 生成 16 字节随机数并以十六进制格式打印

只要某个东西能用 cat 查看,或者能用 > 写入,那么它基本就可以被脚本化。

文件系统地图(FHS)#

和 Windows 不同, Linux 没有盘符的概念。无论是硬盘、 U 盘还是网络共享文件夹,都会被 挂载 到根目录 / 下的某个位置。这种目录布局是由 文件系统层级标准(Filesystem Hierarchy Standard, FHS) 规定的。

文件系统层级标准

日常工作中最常接触的两个目录是 /etc(存放配置文件)和 /var/log(存放日志)。记住以下经验法则,能帮你快速定位问题:

  • 服务启动失败? —— 先看 /var/log/<服务>/ 或者用 journalctl -u <服务> 查看日志。
  • 配置有问题? —— 去 /etc/<服务>/ 检查相关配置文件。
  • 磁盘空间不足? —— 执行 du -sh /* 2>/dev/null | sort -h,找出占用空间最大的顶级目录。
  • 找不到某个命令? —— 使用 which <cmd>,通常它会位于 /usr/bin/usr/local/bin

还有一些初学者需要了解的小细节:

  • /root 是超级用户 root 的家目录,而不是 /home/root。普通用户的家目录才在 /home 下。
  • /proc/sys 是虚拟文件系统——它们只存在于内存中,用于暴露内核状态信息。因此,运行 du -sh /proc 是没有意义的。
  • /tmp 是临时目录,大多数发行版会在系统重启时清空它(通常还会以 tmpfs 的形式挂载在内存中),所以千万别把重要文件放在这里。

一条命令的解剖#

在 Linux 中, Shell 会将每一行命令按照空格分隔,解析为三种不同的部分。

命令结构示意图

1
2
3
4
5
6
7
$ ls -l -a -h --color=auto /var/log /etc
  ^^ ^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^
  |    |          |             |
  |    |          |             参数(指定操作的目标)
  |    |          长选项(完整形式,--name=value)
  |    短选项(单字母标记,可以合并为 -lah)
  命令(需要执行的程序)

掌握以下三个习惯,能让你事半功倍:

  • -lah-l -a -h 是等价的。短选项支持合并书写。
  • 如果路径或字符串中包含空格或 Shell 特殊字符,记得用引号括起来,例如:ls "/var/log my dir"
  • 不确定某个命令的用法时,直接向它“求助”:<cmd> --help 查看简要说明,或者 man <cmd> 阅读完整手册(使用 / 搜索内容,按 q 退出)。

登上一台新机器后的头十分钟#

刚通过 SSH 连接到服务器,别急着动手,先搞清楚五个关键问题。

我是谁?权限如何?#

Shell 提示符已经告诉你答案了。看最后那个字符就行:

1
2
root@web01:~#       # '#'  -> 你是root,权限无限制
alice@web01:~$      # '$'  -> 普通用户,需要时用sudo提权

日常操作千万别直接用root账号登录。 用普通用户登录,必要时再调用sudo。系统会把每次sudo操作记录在审计日志里(路径通常是/var/log/auth.log/var/log/secure),并标记是谁执行的——如果大家都用root,这条线索就没了。

我在哪?周围有什么?#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ pwd
/home/alice
$ ls -lah
total 32K
drwxr-xr-x  4 alice alice 4.0K Jan 15 09:30 .
drwxr-xr-x  6 root  root  4.0K Jan 15 09:00 ..
-rw-------  1 alice alice  220 Jan 15 09:00 .bash_history
-rw-r--r--  1 alice alice 3.8K Jan 15 09:00 .bashrc
drwx------  2 alice alice 4.0K Jan 15 09:30 .ssh
drwxr-xr-x  2 alice alice 4.0K Jan 15 09:30 projects

pwd(显示当前目录)加上ls -lah(长格式、含隐藏文件、人类可读大小)基本就能让你对环境一目了然。

这是什么系统?#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ uname -a
Linux web01 5.15.0-92-generic #102-Ubuntu SMP x86_64 GNU/Linux
$ cat /etc/os-release | head -3
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
$ hostnamectl
   Static hostname: web01
           Chassis: vm
        Machine ID: 9e2f...
   Operating System: Ubuntu 22.04.3 LTS
            Kernel: Linux 5.15.0-92-generic
      Architecture: x86-64

系统负载高不高?#

1
2
3
4
5
6
7
8
9
$ df -h /                # 查看根分区磁盘使用情况
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   12G   26G  31% /
$ free -h                # 内存和交换分区使用情况
               total        used        free      shared
Mem:           7.8Gi       1.2Gi       3.4Gi       128Mi
Swap:          2.0Gi          0B       2.0Gi
$ uptime
 09:32:11 up 47 days,  3:14,  2 users,  load average: 0.18, 0.22, 0.20

负载平均值(load average)表示过去 1 分钟、 5 分钟、 15 分钟内可运行任务+不可中断任务的平均数。如果是 4 核机器,持续高于 4.0 就说明 CPU 已经接近饱和了。

网络是否正常?#

1
2
3
4
5
6
7
8
$ ip -br addr            # 所有网络接口的简要信息
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             10.0.0.42/24
$ ip route | head -2
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.42
$ ping -c 3 1.1.1.1
64 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=2.14 ms

ip命令早已取代了过时的ifconfigroutearp三件套。虽然有些教程还在用ifconfig,但大多数发行版通过兼容包支持它。不过,建议你直接学习ip命令,这才是现代工具。

文件与目录操作:日常词汇表#

以下这些命令是每个工程师都应该熟练掌握的“肌肉记忆”。下面的速查表按照使用场景对它们进行了分类,方便快速找到所需命令。

常用命令按类别分组

目录导航#

1
2
3
4
5
6
pwd                 # 查看当前所在目录
cd /var/log         # 切换到绝对路径
cd projects/api     # 切换到相对路径
cd ~                # 回到家目录(等同于不带参数的 cd)
cd ..               # 返回上一级目录
cd -                # 切换到上一次所在的目录(来回切换)

一个小技巧:pushd / popd / dirs 提供了一个目录栈功能,可以让你快速进入深层目录,再一键返回。 Tab 键补全在所有路径中都能用,效率翻倍。

文件列表查看#

1
2
3
4
5
6
7
ls                  # 简单列出文件
ls -l               # 详细信息(权限、属主、大小、修改时间)
ls -lh              # 更人性化的文件大小显示(如 1.4K、2.3M、7G)
ls -la              # 包括隐藏文件(如 .bashrc、.ssh)
ls -lah             # 综合以上所有(你可能会频繁用到这条)
ls -lt              # 按修改时间排序,最新的排在前面
ls -lS              # 按文件大小排序,最大的排在前面

ll 是 Ubuntu/Debian 系统自带的别名,默认等于 ls -alF。很多人会自定义为 alias ll='ls -lah',写入 ~/.bashrc 中更顺手。

创建与删除#

1
2
3
4
5
6
mkdir reports                    # 创建单个目录
mkdir -p data/2024/01/raw        # 自动创建父目录
touch notes.md                   # 创建空文件,或更新文件的时间戳
rm notes.md                      # 删除单个文件
rm -r reports                    # 递归删除目录
rm -rf reports                   # 强制递归删除,不提示

rm 没有回收站功能: 文件一旦被删除,恢复起来非常困难,通常需要借助专业工具,而且成功率不高。建议养成两个好习惯:

  • 在执行 rm <pattern> 之前,先用 ls <pattern> 确认一下会删哪些文件。
  • 如果比较谨慎,可以在 shell 配置文件中添加 alias rm='rm -i',每次删除都会提示确认。
  • 千万不要运行 rm -rf "$VAR/",除非你确定 $VAR 已经正确设置;如果 $VAR 是空的,命令会变成 rm -rf /。虽然现代 GNU rm 默认会拒绝删除根目录(--preserve-root),但还是别依赖这个保护机制。

复制与移动#

1
2
3
4
5
6
cp report.md report.bak          # 复制文件
cp -r src/ dst/                  # 递归复制目录
cp -a src/ dst/                  # 归档模式:保留权限、链接和时间戳
cp -i src dst                    # 交互模式:覆盖前提示
mv old.md new.md                 # 重命名文件
mv *.log /var/log/archive/       # 批量移动文件

在同一文件系统内,mv 只是修改了目录条目,几乎不耗时,也不会真正复制数据。跨文件系统时,mv 实际上是 cp 加上 rm 的组合操作。

查看文件内容#

1
2
3
4
5
6
cat short.txt                    # 输出整个文件内容(适合小文件)
less /var/log/syslog             # 分页查看:空格向下翻页,b 向上翻页,/ 搜索,q 退出
head -n 20 access.log            # 查看前 20 行(默认 10 行)
tail -n 50 access.log            # 查看最后 50 行
tail -f /var/log/nginx/access.log    # 实时监控日志追加内容
tail -F /var/log/nginx/access.log    # 类似 -f,但支持日志轮转

tail -F 是实时监控日志的标准方法,尤其适合等待请求到来时使用。搭配 grep --line-buffered ERROR 还能实时过滤特定内容。

快速编辑文件内容#

1
2
3
4
5
6
7
8
echo "deployed at $(date)" > deploy.log    # 覆盖写入
echo "step 2 done"        >> deploy.log    # 追加写入

cat > config.yaml <<'EOF'
host: 0.0.0.0
port: 8080
debug: false
EOF

<<'EOF' 是一种带引号的 heredoc,它会禁用变量替换——$VAR 会被原样写入,而不是替换成它的值。如果不加引号,变量会被展开。

文件与内容查找#

两条命令解决绝大多数需求:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 按文件名、类型、时间、大小查找:
find /var/log -name "*.log"             # 按通配符匹配(注意加引号)
find /home/alice -type f -mtime -1      # 查找最近 1 天内修改过的文件
find / -size +100M -type f 2>/dev/null  # 查找大于 100MB 的文件
find . -name "*.tmp" -delete            # 查找并直接删除(小心使用)

# 按内容查找:
grep "ERROR" app.log                    # 在单个文件中查找
grep -rIn "TODO" .                      # 递归查找,显示行号,跳过二进制文件
grep -v INFO app.log                    # 反向查找:排除包含 INFO 的行
grep -E "^(WARN|ERROR)" app.log         # 使用扩展正则表达式

-rIn 是三个常用的选项组合:r 递归查找、跳过 bInary 文件(大写 I)、显示 n 行号。对于超大代码库,推荐使用更快的替代工具 ripgreprg)。

文件信息查询#

1
2
3
4
5
stat report.md           # 查看完整元数据:访问时间、修改时间、状态变更时间、inode、占用块
file mystery.bin         # 根据文件内容判断类型,不依赖后缀名
wc -l access.log         # 统计行数(-w 单词数,-c 字节数)
du -sh ./*               # 查看当前目录下每个子项的磁盘占用,汇总显示
du -sh /var/lib/* 2>/dev/null | sort -h   # 按大小排序

stat 命令区分了三个容易混淆的时间戳:atime(最后一次访问时间)、mtime(最后一次内容修改时间)、ctime(最后一次元数据变更时间,如权限修改)。ls -l 默认显示的是 mtime

管道:把命令拼起来#

管道符号 | 的作用是将一个进程的 标准输出(stdout) 连接到下一个进程的 标准输入(stdin)。整个过程无需创建中间文件,数据会通过内核缓冲区以块的形式流动。这是 Unix 工具链中最核心、最强大的设计理念之一。

管道数据流

举个实际场景的例子:假设你想从 Nginx 的访问日志中找出触发错误响应(5xx 状态码)最多的前 10 个 IP 地址,可以这样操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat /var/log/nginx/access.log \
    | grep ' 5[0-9][0-9] '          \   # 筛选出 5xx HTTP 响应
    | awk '{print $1}'              \   # 提取 IP 地址(第 1 列)
    | sort                          \   # 将相同内容归类排序
    | uniq -c                       \   # 统计连续重复行的数量
    | sort -rn                      \   # 按数字降序排列
    | head -10                          # 取出前 10 行
   1842 203.0.113.42
    611 198.51.100.7
    ...

在日常使用中,以下三个重定向操作符几乎是必备工具:

1
2
3
4
5
cmd > file        # 将标准输出重定向到文件,覆盖原有内容
cmd >> file       # 将标准输出追加到文件末尾
cmd 2> errors     # 仅将标准错误输出重定向到文件
cmd > all 2>&1    # 将标准错误合并到标准输出,然后一起重定向
cmd | tee file    # 将标准输出写入文件,同时继续传递给下游

关于 2>&1 的解释:它的作用是“将文件描述符 2 (stderr)指向文件描述符 1 (stdout)当前所指的位置”。这里需要注意顺序问题:cmd 2>&1 > file 不会 把标准错误写入文件,而 cmd > file 2>&1 才能正确实现这一功能。

如果想深入了解管道、进程替换 <(...)、命名管道(FIFO)以及如何用 xargs 实现并行执行,可以参考 《Linux 文件操作深入解析》 专题。

SSH:登录远程机器#

SSH (Secure Shell)是操作远程 Linux 系统的标准工具。它会对所有数据进行加密,默认使用 TCP 22 端口,同时支持密码认证和公钥认证两种方式。

基本用法#

1
2
3
4
ssh alice@10.0.0.42                  # 使用默认的 22 端口连接
ssh -p 2222 alice@example.com        # 指定自定义端口
ssh -i ~/.ssh/work_ed25519 alice@server   # 明确指定私钥文件
exit                                 # 退出会话(也可以按 Ctrl-D)

如果网络突然断开,终端可能会卡住。此时可以在新的一行输入 ~.(波浪号加点),强制从本地断开连接。

配置免密登录#

通过公钥实现免密登录是更安全、也更推荐的做法。每台设备生成一对密钥,把 公钥 分发到需要访问的所有服务器上。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1. 在本地生成密钥对(Ed25519 是目前的最佳选择)
ssh-keygen -t ed25519 -C "alice@laptop"
#   -> ~/.ssh/id_ed25519       (私钥,务必保密,权限设置为 600)
#   -> ~/.ssh/id_ed25519.pub   (公钥,可以安全地分发)

# 2. 将公钥上传到目标服务器
ssh-copy-id alice@10.0.0.42
#   公钥会被追加到 ~alice/.ssh/authorized_keys,并设置正确的权限

# 3. 以后登录时就无需输入密码了
ssh alice@10.0.0.42

配置好公钥后,建议进一步加固 SSH 服务:编辑 /etc/ssh/sshd_config 文件,将 PasswordAuthentication 设置为 no,然后重启 sshd 服务。如今有大量的自动化扫描程序在全网范围内寻找允许密码登录的 SSH 服务,直接关闭这个入口能有效减少攻击面。

安全加固建议#

  • 如果客户端和服务器都较新,优先使用 Ed25519 密钥(性能更好、体积更小、算法更现代),避免继续使用 4096 位 RSA。
  • 禁用密码认证和 root 用户登录(设置 PermitRootLogin no)。
  • 部署 fail2ban 工具,自动封禁多次尝试失败的 IP 地址。
  • 如果条件允许,在防火墙层面限制 SSH 访问,仅允许来自特定源 IP 段(CIDR)的连接。
  • 修改默认端口(如从 22 改为其他值)虽然能减少随机扫描的噪音,但并不能真正提升安全性。

关于服务管理(如重新加载 sshd 或设置开机自启),可以参考 《Linux 系统服务管理》 文章。

权限和用户:两页讲完#

理解并修改权限#

你已经熟悉了 rwx 三元组的格式。接下来,我们看看如何用 chmod 修改权限,它有两种写法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 数字写法:r=4、w=2、x=1,每组权限相加
chmod 755 deploy.sh        # 文件所有者可读写执行,组用户和其他用户只读执行
chmod 600 ~/.ssh/id_ed25519  # 文件所有者可读写,其他用户无权限(SSH 私钥要求)
chmod 644 README.md        # 文件所有者可读写,组用户和其他用户只读

# 符号写法:谁(u/g/o/a) +/-/= 什么(r/w/x)
chmod u+x deploy.sh        # 给文件所有者添加执行权限
chmod g-w report.md        # 移除组用户的写权限
chmod o= secrets.env       # 完全移除其他用户的权限
chmod -R a+r docs/         # 递归赋予所有用户读权限

以下是一些常见权限模式,建议记住它们的用途:

模式含义典型场景
755rwxr-xr-x可执行文件、公开脚本
644rw-r–r–配置文件、源代码文件
700rwx——私有目录
600rw——-SSH 私钥、敏感文件
400r——–只读敏感文件

关于 SUID、 SGID、 sticky bit、 ACL 和 umask 的详细内容,请参考 《Linux 文件权限》

切换用户:susudo#

1
2
3
4
sudo apt update              # 以 root 身份运行单条命令(有审计记录,使用你的密码)
sudo -i                      # 进入交互式的 root shell(有审计记录)
su - root                    # 切换到 root 用户(需要 root 密码,通常被禁用)
su - bob                     # 切换到用户 bob,并加载其环境

现代系统默认推荐使用 sudo,因为它会记录 何时 执行了 哪些操作,并且无需共享 root 密码。在全新安装的 Ubuntu 系统中,第一个用户会自动加入 sudo 组;而在 RHEL 系发行版中,对应的组是 wheel

用户创建、组成员管理、密码策略、useradd/usermod/userdel 命令以及 /etc/passwd/etc/shadow 的内部机制,请参阅 《Linux 用户管理》

进程,最小集合#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ps aux                            # 查看所有进程的快照
ps aux | grep nginx               # 按名称筛选特定进程
ps -ef --forest                   # 显示进程树,清晰展示父子关系
top                               # 实时监控,默认按 CPU 排序;按 M 切换到内存排序,q 退出
htop                              # 更美观的 top 工具(通常需要额外安装)

kill 1234                         # 发送 TERM 信号,允许进程优雅退出并清理资源
kill -9 1234                      # 强制终止进程,内核直接介入,无任何清理机会
killall nginx                     # 终止所有名为 nginx 的进程
pkill -f 'python worker.py'       # 根据完整命令行匹配并终止进程

command &                         # 在当前 shell 中以后台模式运行命令
nohup long-job &                  # 即使退出登录也能继续运行任务(输出记录到 nohup.out)
jobs                              # 查看当前 shell 中的所有后台任务
fg %1                             # 将编号为 1 的后台任务切换到前台运行

优先使用普通的 kill 命令,只有在进程完全无响应时才考虑 kill -9。因为 -9 是强制终止信号,进程无法捕获或处理,可能导致缓冲区未刷新、网络连接未关闭或锁未释放等问题,进而引发状态不一致。

关于 CPU/内存/IO 监控工具(如 vmstatiostatpidstat)、进程优先级调整(nice/renice)、控制组(cgroup)以及 OOM killer 的详细内容,请参考 《Linux 进程与资源管理》 文章。

包管理 30 秒入门#

在 Linux 系统中,安装软件通常依赖包管理器,而不是通过下载安装程序来完成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Debian / Ubuntu (apt)
sudo apt update                      # 更新软件包索引
sudo apt install nginx               # 安装 Nginx
sudo apt remove nginx                # 卸载软件,保留配置文件
sudo apt purge  nginx                # 卸载软件并删除配置文件
sudo apt search keyword              # 搜索关键词相关的软件包

# RHEL / CentOS / Rocky / Alma (dnf;CentOS 7 及更早版本使用 yum)
sudo dnf install nginx               # 安装 Nginx
sudo dnf remove  nginx               # 卸载软件
sudo dnf search  keyword             # 搜索软件包
sudo dnf upgrade                     # 升级整个系统

# Arch (pacman)
sudo pacman -Syu                     # 同步仓库并升级系统
sudo pacman -S    nginx              # 安装 Nginx
sudo pacman -R    nginx              # 卸载软件

这种方式的优势在于:它能够自动解决依赖关系,所有软件包都经过发行版的签名验证,确保安全性,同时只需一条命令即可完成整个系统的更新。

如果你想了解更多,比如从源码编译、手动安装 .deb.rpm 包、使用其他生态工具(如 snapflatpakpipnpm),或者管理第三方软件源,可以参考 《Linux 软件包管理》 专题。

几个能救你命的习惯#

  1. /etc 之前,先给自己留条后路。

    1
    
    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
    

    新配置搞砸了 SSH?别慌,旧配置就在一个 cp 的距离。

  2. 改 SSH 配置时,千万别只靠一个连接活着。 在编辑 sshd_config 之前,记得再开一个 SSH 会话。如果新配置导致无法登录,老会话还能帮你回滚改动。这条经验已经拯救过无数个周末和假期。

  3. 以下命令,请当作核弹按钮对待:

    • rm -rf / —— 删天删地删空气(虽然现代 rm 会拒绝这种操作,但还是别去试)。
    • dd if=/dev/zero of=/dev/sda —— 把整块硬盘清零,数据恢复?不存在的。
    • chmod -R 777 / —— 全局可写,系统安全模型瞬间崩塌。
    • > /etc/passwd —— 截断用户数据库,系统还能撑到下次重启。

    动手之前,务必用 lslsblkcat 确认目标无误。

  4. 日志通常比你更懂问题出在哪,先看看它们怎么说。

    1
    2
    3
    4
    
    sudo tail -f /var/log/syslog                    # 通用日志(Debian/Ubuntu)
    sudo tail -f /var/log/messages                  # 通用日志(RHEL 系)
    sudo grep 'Failed password' /var/log/auth.log   # 查看 SSH 暴力破解尝试
    sudo journalctl -u nginx -n 50 --no-pager       # 查看某个服务的最近 50 条日志
    

下一步#

这篇文章的目的是为你提供一份学习路线图。每个主题都有专门的深度文章,当你需要深入了解时可以参考:

  • 《Linux 文件权限详解》 —— SUID/SGID/sticky 位、 ACL 访问控制列表、umask 设置、权限继承机制。
  • 《Linux 用户与组管理》 —— 使用 useradd 创建用户、用户组管理、 sudoers 文件语法、 PAM 模块配置、密码策略设置。
  • 《Linux 磁盘与存储管理》 —— 分区表操作、文件系统类型、挂载点管理、 LVM 逻辑卷、 RAID 配置。
  • 《Linux 系统服务管理》 —— systemd 服务单元、日志工具 journalctl、定时任务配置。
  • 《Linux 软件包管理全攻略》 —— 软件源配置、 GPG 签名验证、从源码编译安装、 alternatives 工具使用。
  • 《Linux 进程与资源调度》 —— 系统监控工具、 cgroups 资源限制、进程调度策略、 OOM (内存不足)处理机制。
  • 《Linux 高级文件操作技巧》 —— 管道符 |、输入输出重定向、xargs 命令、tee 工具、命名管道 FIFO。

Linux 的学习不是一蹴而就的。建议你启动一台免费的云虚拟机(或者在本地使用 VirtualBox、 Multipass 或 WSL2),打开终端,刻意去“折腾”甚至“搞坏”系统——通过实践积累经验,是培养肌肉记忆的最佳途径。

参考文献#

本系列

Linux 9 篇

  1. 01 Linux(一):使用基础 当前
  2. 02 Linux(二):文件权限 —— rwx、chmod、chown 与超越它们的机制
  3. 03 Linux(三):磁盘管理
  4. 04 Linux(四):软件包管理
  5. 05 Linux(五):用户管理
  6. 06 Linux(六):系统服务管理
  7. 07 Linux(七):进程与资源管理 —— 从 top 到 cgroups
  8. 08 Linux(八):文件操作深入解析
  9. 09 Linux(九):Vim 编辑器精要

读有所得?

GitHub 关注我 → 新文周更

GitHub