← 返回文章归档

Linux 使用学习:从终端到日常排错

建立 Linux 的目录、命令、权限、管道和进程管理基础,用一个小练习串起查文件、读日志与检查服务的常用操作。

先分清 Linux、发行版和 Shell

Linux 是内核。Ubuntu、Debian 等发行版把内核、系统工具和软件包管理组织成可使用的系统。终端是输入输出界面,Shell 是解释命令的程序;Bash 只是其中一种。

本文的命令适用于常见 Linux 环境,Shell 示例以 Bash 为准。在普通用户的练习目录操作即可,不需要一开始就用管理员权限。

目录与路径

Linux 的目录树从 / 开始,文件名区分大小写。绝对路径从根目录写起,相对路径从当前目录计算。~ 通常由 Shell 展开为当前用户的主目录,. 是当前目录,.. 是上一级。

路径常见用途
/home普通用户的主目录
/etc系统与服务配置
/var/log日志文件
/tmp临时文件
/proc内核提供的进程和系统信息接口

创建一个自己的实验目录:

mkdir -p ~/linux-practice
cd ~/linux-practice
pwd
printf '%s\n' 'INFO start' 'ERROR timeout' 'INFO done' > app.log
ls -lah

pwd 确认当前位置,ls -lah 显示隐藏文件和详细信息。遇到带空格的路径,用引号包起来,例如 cd "my notes"。

查看与查找

# 短文件可以直接输出,长文件更适合分页阅读
cat app.log
less app.log

# 查找内容;-n 显示行号
grep -n 'ERROR' app.log

# 按文件名查找,通配符交给 find 处理
find . -type f -name '*.log'

# 查看最后几行
tail -n 10 app.log

在 less 中,输入 /关键词 搜索,按 n 查看下一个匹配,按 q 退出。看正在增长的日志可以使用 tail -f app.log,按 Ctrl+C 停止跟随。

查命令用法时先看 man grep 或 grep --help。不要仅凭记忆拼参数,也不要把不同发行版或不同实现的选项当作完全一致。

管道、重定向与引号

# 标准输出交给下一个命令
grep 'INFO' app.log | wc -l

# > 覆盖文件,>> 追加文件
printf '%s\n' 'INFO another request' >> app.log

# 分别保存正常输出和错误输出
ls . missing-file > listing.txt 2> errors.txt

管道默认连接前一个命令的标准输出和后一个命令的标准输入,错误输出不会自动进入管道。文件描述符 1 和 2 分别对应标准输出、标准错误;2>&1 可以把错误输出重定向到当前标准输出的去向。顺序会影响结果,参见 GNU Coreutils 的 I/O 重定向说明。

单引号通常保留文本的字面含义;双引号允许变量等展开,同时避免普通的分词问题。写脚本时,路径变量通常应该写成 "$logfile"。Bash 的完整规则见 Bash Reference Manual。

理解权限,而不是直接 chmod 777

ls -l 的权限部分按所有者、所属组、其他用户分成三组,每组有读 r、写 w、执行 x。

printf '%s\n' '#!/usr/bin/env bash' 'printf "hello Linux\n"' > hello.sh
chmod u+x hello.sh
./hello.sh

对普通文件,执行权限允许尝试把文件作为程序执行;对目录,执行权限表示可以搜索或穿越目录,读权限表示可以列出目录项,写权限关系到目录项的增删。删除文件通常取决于父目录权限,而不只取决于文件自身。

权限有问题时,先检查文件所有者、所属组以及父目录。sudo 用于按授权提升权限,不是遇到报错时的通用修复按钮。

进程、端口与服务

ps -eo pid,ppid,stat,comm
ss -lnt
df -h
du -sh ~/linux-practice

df 观察文件系统容量,du 统计目录中文件占用,两者回答的问题不同。确认某个进程后,可以用 kill -TERM 实际PID 请求它正常退出;强制终止可能跳过清理工作,应在必要时使用。

使用 systemd 的系统可以这样检查服务,服务名称需按实际安装情况替换:

systemctl status nginx
journalctl -u nginx -n 50 --no-pager

容器内或其他初始化系统不一定提供 systemd。服务不可访问时,先确认进程是否存在、端口是否监听,再看日志与网络配置。

形成一套练习顺序

用上面的 app.log 完成三个任务:统计 ERROR 行数,把 INFO 行写到一个新文件,找出当前目录里所有 .log 文件。再解释 > 与 >> 的区别,以及为什么 find 的 *.log 要加引号。

下一步可以学习 SSH、环境变量、软件包管理和 Shell 脚本。对每个命令都记录“输入是什么、输出是什么、修改了什么”,比只背命令名字更容易真正用起来。

✳

感谢阅读,下一篇再见。

回到文章开头 ↑