最近带了几位刚转 Python 的同事,发现一个特别普遍的现象:代码写得挺溜,一到服务器上就卡壳。不是不知道 print 怎么调试,而是不知道日志在哪看、进程怎么查、端口被谁占了、文件权限为什么报错。很多人第一反应是装个图形界面,或者硬着头皮用 WinSCP 拖文件——其实日常干活根本不需要那么复杂。
我做了快十年 Python 开发,从写爬虫到部署线上服务,真正每天都在敲的 Linux 命令不超过二十个。这篇文章就把这些高频命令一个个拆开讲明白,结合真实场景说明它们到底是干嘛的、什么时候用、有哪些容易踩的坑。目标是让 Python 程序员花最少的时间掌握足以支撑日常开发、调试、排查问题的命令功底,无论是本地开发环境还是线上服务器,都能从容应对。
1. 为什么 Python 程序员绕不开 Linux 命令
不是制造焦虑,而是现实摆在那里:绝大多数后端服务、爬虫脚本、数据任务跑在生产环境都是 Linux 服务器。你在 Windows 或 macOS 上写完代码,最终要部署到 Linux 上运行;线上出了问题,没有任何 IDE 图形界面给你点,只能靠命令一行行去查。这不是运维专属技能,而是 Python 开发者的基本功。
1.1 Windows 与 Linux 实际使用场景差异
先看一组最常见的对应关系,心里有个底:
| 场景 | Windows 常用操作 | Linux 对应命令 |
|---|---|---|
| 看当前目录 | dir |
pwd + ls |
| 切换目录 | cd + 盘符 |
cd |
| 复制文件 | copy |
cp |
| 移动/重命名 | move/rename |
mv |
| 删除文件 | del |
rm |
| 查看端口占用 | netstat -ano |
ss -lntp 或 netstat -lntp |
| 查看进程 | 任务管理器 | ps aux / top |
| 查看文件内容 | 记事本/type | cat / less / tail |
这样一看就直观多了。核心差异在于:Linux 没有盘符概念,一切从根 / 开始;Linux 几乎所有东西都是文件,设备、管道、日志统统可以按文件方式处理;Linux 的命令组合能力极强,可以通过管道把多个命令串起来完成复杂任务。
1.2 Python 开发中命令介入的高频节点
以我自己的经验,Python 开发流程里命令介入的节点非常固定:
- 创建虚拟环境:
python3 -m venv venv,然后source venv/bin/activate - 安装依赖:
pip install -r requirements.txt - 跑测试:
pytest,但经常需要先看进程是否残留 - 看日志:日志文件在服务器某个路径下,用
tail -f实时跟踪 - 排查问题:先看进程
ps aux | grep python,再看端口ss -lntp | grep 8000,最后看日志 - 部署:拉代码
git pull、重启服务systemctl restart xxx、或用nohup跑脚本
每个节点都离不开命令。把这些节点对应的命令吃透,等于把 Python 开发的主干流程打通了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高频文件操作命令与避坑细节
文件操作是使用频率最高的部分。不是简单记住 ls、cp、rm 就完事了,关键是理解不同命令在 Python 项目场景下的具体用法和常见陷阱。
2.1 ls、cd、find 的组合使用技巧
ls 最容易被忽略的是各种参数组合。日常我用得最多的几个:
bash复制ls -lh # 以人类可读方式显示文件大小
ls -la # 显示隐藏文件,例如 .env、.gitignore
ls -lt # 按修改时间排序,快速找到最新改动的文件
ls *.py # 匹配当前目录下所有 Python 文件
find 则是定位文件的大杀器。有一次线上报错说找不到配置文件,我就用下面这条命令全盘搜索:
bash复制find / -name "settings.py" 2>/dev/null
2>/dev/null 把权限报错丢弃掉,避免刷屏。如果只想找当前项目目录下的文件,可以限制路径:
bash复制find . -name "*.py" -mmin -30
这条命令查找当前目录下最近30分钟内修改过的 Python 文件。调试代码时特别好用,能快速定位到底改了哪些文件。
实战中还有一个高频需求:清理 __pycache__ 缓存目录。运行 Python 项目久了会积累大量缓存文件,既占空间又容易引起干扰。一条命令搞定:
bash复制find . -type d -name "__pycache__" -exec rm -rf {} +
注意 {} 和 + 是 find 的固定语法,意思是把找到的目录逐个传给 rm -rf 执行。
2.2 rm 删除操作的危险边界
rm 是新手最容易出事的命令。先记住一条铁律:rm 删掉的文件不进回收站,找不回来。
bash复制rm file.py # 删除单个文件
rm -r mydir/ # 递归删除目录及其内容
rm -rf mydir/ # 强制递归删除,不提示
生产环境上最忌讳的就是 rm -rf 后面跟变量,一旦变量为空或者路径写错,后果不堪设想。比如:
bash复制rm -rf /var/www/$PROJECT/static
如果 $PROJECT 环境变量没设置,命令就变成了 rm -rf /var/www/static,如果路径再有问题,甚至可能直接清理掉关键目录。我的习惯是在执行删除前先用 ls 确认路径:
bash复制ls -d /var/www/mysite
rm -rf /var/www/mysite
两行命令分开执行,宁可多敲一次,也不冒险。另外,删除文件夹这个需求很多人会遇到,Linux 里没有 Windows 那种"回收站"概念,rm -r 就是删除目录的唯一标准方式。如果确实担心误删,可以自己封装一个 trash 命令,把文件移动到 ~/.trash 目录,就像 Windows 回收站一样。
2.3 ln 软链接在项目部署中的作用
软链接是我部署 Python 项目时经常用的工具。它的作用类似于 Windows 的快捷方式,但比快捷方式强大得多。
典型场景:项目静态文件存储在数据盘 /data/uploads,但代码里写死的路径是 /var/www/mysite/uploads。不需要改代码,直接建软链接:
bash复制ln -s /data/uploads /var/www/mysite/uploads
这样访问 /var/www/mysite/uploads 就等于访问 /data/uploads,代码和目录结构完全不用动。
另一个经典用法是管理 Python 版本。系统自带的 Python 版本可能比较老,但你不想把系统 Python 换掉,就可以把新版本装到 /usr/local/python3.12,然后:
bash复制ln -sf /usr/local/python3.12/bin/python3.12 /usr/local/bin/python3
以后终端里执行 python3 用的就是新版本。-f 参数表示如果目标已存在则强制覆盖。
软链接的坑在于:如果目标真实路径被删除或移动,软链接会变成"悬空"状态,访问时报 No such file or directory。排查时用 ls -l 看链接指向,再用 readlink 确认目标:
bash复制readlink /usr/local/bin/python3
3. 文本处理三件套:grep、sed、awk 在日志分析中的实践
Python 程序员排查线上问题,80% 的时间在跟日志打交道。日志文件动辄几百 MB,不可能用 IDE 打开慢慢翻。这时候 grep、sed、awk 就是最快的分析工具。
3.1 grep 精准过滤日志关键字
grep 是日志排查的第一道工序。最基本的用法是查找关键字:
bash复制grep "Traceback" app.log
只要日志里有 Python 报错堆栈,这一条就能全部捞出来。但实际场景没那么简单,往往需要组合参数:
bash复制grep -n "Traceback" app.log # 显示行号,方便定位
grep -i "error" app.log # 忽略大小写
grep -v "debug" app.log # 反向过滤,排除包含 debug 的行
grep -E "ERROR|CRITICAL" app.log # 正则匹配多个关键词
grep -r "api_timeout" /var/log/ # 递归搜索目录下所有文件
最有用的一个组合是统计关键字出现次数。比如想确认某个错误在一天里出现了多少次:
bash复制grep -c "Connection refused" app.log
如果统计每个错误类型分别出现多少次,可以用 sort 和 uniq 配合:
bash复制grep -E "ERROR|CRITICAL" app.log | sed 's/.*\(ERROR\|CRITICAL\)/\1/' | sort | uniq -c | sort -rn
这条命令先把日志里的 ERROR、CRITICAL 级别行过滤出来,然后提取级别字段,统计每种级别的数量,最后按数量从大到小排序。排查系统告警时,这个用法能快速判断是偶发错误还是大面积故障。
实际看日志时,我经常用下面这条命令查看某个时间段附近的上下文:
bash复制grep -n -A 20 "Traceback" app.log
-A 20 表示匹配行之后多显示20行,这样可以看到完整的异常堆栈和调用链。
3.2 sed 快速提取和替换文本片段
sed 最常用来做替换和提取。Python 开发里有几个痛点它能轻松解决。
场景一:批量替换代码文件里的变量名。比如把一个项目里的 old_api_url 批量替换成 new_api_url:
bash复制sed -i 's/old_api_url/new_api_url/g' config.py
-i 是直接修改文件,g 表示替换每一行中的所有匹配。替换前建议先不加 -i 跑一遍,看看会输出什么:
bash复制sed 's/old_api_url/new_api_url/g' config.py
确认无误后再加 -i,避免改坏文件。
场景二:提取日志里的 IP 地址或时间戳。假设日志格式是:
code复制2025-01-15 10:23:45,678 - requests - INFO - GET http://example.com 200
提取访问时间:
bash复制sed -n 's/.*\(2025-01-15 [0-9:]*\).*/\1/p' access.log
-n 和 p 配合起来表示只打印匹配的行。这种用法在分析日志、清洗数据时经常能派上用场。
3.3 awk 按列切割统计数据
awk 是按列处理文本的利器,特别适合日志格式规整的场景。默认按空格或 Tab 切分列,$1 表示第一列,$2 表示第二列,依此类推。
Python Web 服务的访问日志通常包含客户端 IP、请求时间、请求路径、状态码、响应时间等字段。统计访问量最高的 IP:
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
统计接口平均响应时间。假设响应时间在最后一列:
bash复制awk '{sum += $NF} END {print sum / NR}' access.log
$NF 表示最后一列,NR 是行号,END 块在所有行处理完后执行。这条命令的意义在于:不需要写 Python 脚本,一条命令就能计算出平均响应时间。
awk 还支持条件筛选。假设日志第9列是状态码,找出所有 500 错误的请求:
bash复制awk '$9 == 500 {print $7}' access.log | sort | uniq -c
这里 $7 是请求路径,最后输出的是每个路径出现 500 错误的次数,帮我们快速锁定哪个接口最不稳定。
三件套配合管道使用才是完全体。一条典型的日志分析命令可能是这样的:
bash复制cat app.log | grep "ERROR" | awk '{print $2}' | sort | uniq -c | sort -rn
从原始日志到错误类型统计,一条命令走完,连脚本都不用写。这就是 Linux 命令组合能力的魅力所在。
4. 进程、资源与 Python 服务管理
Python 程序跑在服务器上,最担心的就是进程悄悄挂掉、CPU 飙升、内存泄漏这些问题。掌握进程和资源相关命令,能快速定位系统层面的异常。
4.1 ps、top 定位异常消耗的 Python 进程
ps 命令用于查看当前系统进程快照。Python 项目最常见的排查场景:服务器负载突然升高,不确定是不是自己的脚本导致的。
bash复制ps aux --sort=-%cpu | head -10
这条命令按 CPU 占用率从高到低排列,只显示前10个进程。输出结果里能看到每个进程的 PID、CPU 占用、内存占用、启动命令。如果某个 python app.py 的 CPU 占用到了 200%,基本可以断定是这段代码出问题了。
按内存排序定位内存泄漏:
bash复制ps aux --sort=-%mem | head -10
top 则是动态刷新版,适合持续观察。top -p PID 只看指定进程,按 Shift + M 按内存排序,按 Shift + P 按 CPU 排序。配合 htop(如有安装)操作体验更友好。
4.2 kill / kill -9 的正确使用时机
要不要用 kill -9,是 Python 程序员在服务器上经常纠结的问题。先明确:kill 默认发送 TERM 信号,请求进程正常退出,给程序执行清理逻辑的机会;kill -9 发送 KILL 信号,由内核直接强制终止,进程没有机会做任何清理。
正确姿势是先温和后强制:
bash复制kill PID # 发送 TERM 信号,等待进程正常退出
kill -9 PID # 等待几秒后仍无响应,再强制杀掉
如果不知道 PID,先查进程号再杀:
bash复制ps aux | grep "python app.py" | grep -v grep
kill 12345
这里 grep -v grep 是过滤掉 grep 自身那条进程,否则会误杀。还有一个简洁的写法:
bash复制pkill -f "python app.py"
pkill 按命令名匹配进程并发送信号,-f 表示匹配完整命令行。比先用 ps 查 PID 再 kill 快得多。
Python 服务被 kill -9 杀掉后的典型问题:数据没落盘、缓存没清理、下次启动报端口被占用。所以正常情况下尽量避免直接 kill -9,特别是跑着任务队列或数据库操作的进程。
4.3 nohup 与 systemd 管理常驻 Python 脚本
写完一个爬虫或数据处理脚本,想让它放到服务器后台运行,最入门的方式是:
bash复制nohup python script.py > app.log 2>&1 &
nohup 表示即使终端关闭,进程也不挂断;> 将标准输出重定向到日志文件;2>&1 把标准错误也合并到同一个日志;最后的 & 让命令进入后台执行。这是临时跑脚本的最快方案。
但如果这个脚本要长期作为服务跑,更规范的做法是用 systemd 管理。写一个 service 文件:
ini复制[Unit]
Description=My Python Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/myproject/app.py
WorkingDirectory=/opt/myproject
Restart=always
User=www-data
[Install]
WantedBy=multi-user.target
保存到 /etc/systemd/system/myapp.service 后执行:
bash复制systemctl daemon-reload
systemctl start myapp
systemctl enable myapp # 开机自启
systemctl status myapp # 查看运行状态
Restart=always 让服务崩溃后自动拉起来,这个参数我特别看重。写 Python 服务最怕进程不明不白死掉,有了 systemd 托管,至少能保证挂了会自动重启。
查看服务实时的输出日志:
bash复制journalctl -u myapp -f
-f 是 follow 模式,类似 tail -f,持续刷新输出。
4.4 free、df、du 排查资源瓶颈
free 查看内存使用情况,df 查看磁盘空间,du 查看目录占用,这三个是资源排查的基本工具。
bash复制free -h
df -h
du -sh /opt/myproject/*
free -h 里重点关注 available 一列,这才是真正可用的内存量。如果 available 很低,即使还有 swap,Python 应用的性能也会明显下降。
df -h 最怕的是 / 根分区 100% 占满,服务直接写不进日志。定位大文件:
bash复制du -sh /var/log/* | sort -rh | head -10
对比 df 和 du 还有一个隐含坑:文件被进程占用但已删除,df 显示空间还是满的,du 却找不到大文件。这种时候用 lsof | grep deleted 找到占用已删除文件的进程,重启它就能释放空间。
5. 网络排查命令与接口调试
Python 后端开发几乎天天跟网络打交道:接口调不通、端口被占用、服务之间连不上。掌握常用的网络排查命令,可以少走很多冤枉路。
5.1 curl 测试接口与查看响应头
curl 是调试 HTTP 接口的第一工具。开发完一个 Flask/FastAPI 接口,先用 curl 验证一遍再交给前端,是基本素养。
最简单的 GET 请求:
bash复制curl http://localhost:8000/api/users
加上 -i 看响应头:
bash复制curl -i http://localhost:8000/api/users
POST 提交 JSON 数据:
bash复制curl -X POST http://localhost:8000/api/users \
-H "Content-Type: application/json" \
-d '{"name": "zhang", "age": 25}'
服务器返回 500,想看完整的过程和耗时,加 -v:
bash复制curl -v http://localhost:8000/api/users
-v 会输出 DNS 解析、TCP 连接、SSL 握手、请求头和响应头全过程。线上接口偶发超时,用 curl -w 看各阶段耗时:
bash复制curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nTCP连接: %{time_connect}s\n响应: %{time_total}s\n" http://example.com/api
这条命令把页面内容丢弃,只输出各个阶段消耗的时间。接口慢是慢在 DNS、TCP 还是服务处理,一目了然。Python 接口响应慢但本地测试正常,用这种办法能快速判定是不是网络环节的问题。
5.2 telnet 测试端口连通性
telnet 虽然老,但在排查端口连通性时无可替代。很多 Python 服务依赖 MySQL、Redis、Kafka,应用连不上数据库时,第一件事就是确认端口是否通。
bash复制telnet 192.168.1.10 3306
如果端口通,会显示连接成功或返回一些协议信息;如果端口不通,会卡住直到超时,或者直接提示 Connection refused。除了 telnet,nc(netcat)也能干这事:
bash复制nc -zv 192.168.1.10 3306
-z 表示扫描模式不发送数据,-v 显示详细过程。有些服务器没有装 telnet,但几乎都自带 nc 或者可以快速安装。
5.3 ss 与 netstat 查看端口占用情况
Python 服务启动时报 Address already in use,是再常见不过的坑。原因就是上次的进程没杀掉,端口还被占着。
查找谁占用了 8000 端口:
bash复制ss -lntp | grep 8000
-l 表示列出监听中的端口,-n 不做域名解析直接显示数字,-t 只看 TCP,-p 显示进程信息。
输出结果示例:
code复制LISTEN 0 128 0.0.0.0:8000 0.0.0.0:* users:(("python",pid=12345,fd=8))
看到 pid=12345,就知道是 PID 为 12345 的 python 进程占着端口。然后按第4章的方法处理。
如果没有 ss,老一点的系统可能用 netstat:
bash复制netstat -lntp | grep 8000
两个命令的作用完全一样,netstat 在新系统上可能没装,需要 apt install net-tools。
排查接口连不上的一般思路是:先 ping 看主机通不通,再 telnet 看端口通不通,最后 curl 看 HTTP 层是否正常。三层排查下来,问题出在哪个环节就很清楚了。
6. 在 Linux 上配置 Python 开发环境
很多新手在 Linux 上装 Python 时容易踩坑:系统自带的 Python 不能乱动,因为很多系统工具依赖它;自己装的 Python 又不知道放哪、怎么切换版本。这一节把最常见的问题说透。
6.1 apt 安装与源码编译的区别
在 Debian/Ubuntu 系上,安装 Python 最常见的两种方式:apt 包管理和源码编译。快速部署选 apt,需要特定版本或最新版选源码编译。
bash复制apt update
apt install python3 python3-pip python3-venv
apt 方式安装的 Python 跟系统深度集成,依赖处理自动完成,但版本通常不是最新的。比如 Ubuntu 22.04 自带的 Python 3.10,已经能跑绝大多数项目。
需要指定版本时,比如要装 Python 3.12,可以用 deadsnakes PPA:
bash复制apt install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt update
apt install python3.12 python3.12-venv python3.12-distutils
这种方式既能保持系统 Python 不动,又能用上新版本。
源码编译则是更通用的办法,特别是 CentOS/RHEL 系没有那么多现成包时。编译三步走:
bash复制wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz
tar -xzf Python-3.12.1.tgz
cd Python-3.12.1
./configure --enable-optimizations
make -j$(nproc)
make install
--enable-optimizations 会做性能优化,编译时间会长一些但值得等。make install 默认装到 /usr/local/bin,最后的 make install 执行完后验证一下:
bash复制python3 --version
源码编译的关键坑:如果系统缺少编译依赖,会报各种 No module named '_ctypes' 之类的错,通常是因为缺 libffi-dev、libssl-dev。编译前先把依赖装齐:
bash复制apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget
6.2 update-alternatives 实现多版本切换
一台机器上装了多个 Python 版本后,切换就成了新问题。update-alternatives 是 Debian/Ubuntu 系管理命令版本链接的标准工具。
配置 Python3 备选版本:
bash复制update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 2
配置后手动切换:
bash复制update-alternatives --config python3
执行后终端会列出所有 Python 版本,输入序号回车就能切换。--install 后面的数字是优先级,数字越大优先级越高,如果不想手动切换,可以设一个默认优先。
需要注意:/usr/bin/python3 千万不要随便指向不兼容的版本。Ubuntu 的 apt 工具本身就依赖 Python3,如果把默认 python3 切换到 3.12,而 apt 只支持 3.10,系统就可能出问题。所以优先级数字我习惯设成一样,让系统保持默认 Python,只在虚拟环境里使用新版本。
6.3 venv 虚拟环境与 pip 镜像源配置
Python 项目隔离环境是必须做的基本功。创建虚拟环境:
bash复制python3 -m venv venv
source venv/bin/activate
激活后终端提示符前面会出现 (venv),这时候 pip 安装的包都装在这个虚拟环境里,不会污染系统 Python。退出虚拟环境:
bash复制deactivate
有个容易忽略的细节:新创建的虚拟环境里 pip 版本通常较旧,先升级一下再装依赖:
bash复制pip install --upgrade pip
国内服务器装 pip 包经常因网络问题超时,配置镜像源能极大提升速度。临时指定:
bash复制pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
长期配置,修改 ~/.pip/pip.conf:
ini复制[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
配置完成后,pip install 就会走镜像源,速度快很多。
还有一个经典问题:系统里同时存在 Python2 和 Python3,有些服务器上执行 pip 是给 Python2 用的,执行 pip3 才是 Python3。稳妥的做法是明确指定解释器:
bash复制python3 -m pip install requests
用 python3 -m pip 而不是裸 pip,能确保装到正确的 Python 环境里,这个习惯能帮你避免不少诡异问题。
6.4 远程开发:VS Code Remote-SSH 场景下的命令联动
很多 Python 开发者现在用 VS Code 远程连接服务器写代码。这种方式下,编辑器里直接打开终端就是服务器终端,可以一边写代码一边敲命令,非常顺畅。
连接后第一件事,通常是确认远程环境和本地一致:
bash复制python3 --version
which python3
遇到代码在本地跑得好好的、到服务器上报错,先检查依赖完整性:
bash复制pip list
和本地 pip freeze 对比,找出差异。再检查虚拟环境是否激活,代码里用的路径在服务器上是否存在。远程开发还有一个容易踩的坑:文件权限。VS Code 默认用户可能没有权限写入项目目录,在服务器终端执行:
bash复制sudo chown -R $USER:$USER /opt/myproject
把项目目录的所有者改成当前用户,后面读写文件就不会再碰到 Permission denied 了。
7. 高效查找历史命令与提升效率的技巧
最后分享几个能显著提升效率的命令技巧。这些不算必修课,但掌握了会让日常操作顺手很多。
7.1 history 命令:回溯错误操作与复用复杂命令
history 查看当前用户执行过的命令历史:
bash复制history
配合 grep 搜索历史命令,比如找之前跑过的某条部署命令:
bash复制history | grep "systemctl restart"
历史命令回溯对排查问题特别有用。有一次线上环境被人改过配置,我通过 history 找到了操作时间和具体命令,很快就定位到问题根源。
快速复用历史命令的快捷键:
!!:重复上一条命令!$:引用上一条命令的最后一个参数Ctrl + R:逆向搜索历史,输入关键字自动补全
其中 Ctrl + R 是我用得最多的。想找之前执行过的 nohup python 命令,按 Ctrl + R 再输入 nohup,终端会自动匹配最近的记录,回车就能执行。
7.2 watch 命令实时监控变化
watch 可以定时重复执行指定命令,非常适合监控某些指标的变化。比如每隔2秒刷新一次内存使用情况:
bash复制watch -n 2 free -h
监控指定 Python 进程是否存在:
bash复制watch -n 5 "ps aux | grep python"
还能配合磁盘命令监控某个目录的占用增长情况:
bash复制watch -n 3 "du -sh /var/log"
排查磁盘空间被什么写满时,用 watch 观察目录大小变化,能快速锁定是哪个目录在持续增长。
7.3 终端多开与 tmux 的使用价值
服务器上跑长任务时,最怕 SSH 断开导致进程中断。虽然 nohup 能解决部分问题,但更优雅的方案是 tmux——一个终端复用工具。
bash复制tmux new -s work # 新建一个名为 work 的会话
在 tmux 会话里正常执行命令,即使 SSH 断开,任务也会继续跑。回来重新连接后:
bash复制tmux attach -t work
就能看到任务还在运行。
对我而言,tmux 的最大价值是同时管理多个任务。开一个窗口跑 Django 开发服务器,开另一个窗口看日志,再开一个窗口执行数据库迁移,互不干扰。切换窗口的快捷键是 Ctrl + b 后再按数字键。tmux 的学习成本很低,但对远程开发体验的提升非常明显,建议花十分钟试一下,回不去的。
8. Linux 命令面试高频考点速览
如果你正在准备 Python 岗位面试,Linux 命令几乎是必考板块。结合常见面试题做几个集中梳理,既有基础也有深度。
8.1 高频面试题与参考回答
如何查看某个端口是否被占用?
优先说 ss -lntp | grep 端口号,再补充 netstat -lntp 也可以,顺便说明 -l 是监听、-t 是 TCP、-n 是数字显示、-p 是进程信息。
如何查看 Python 进程并安全关闭?
ps aux | grep python 找到 PID,kill PID 优雅退出,确认无响应再用 kill -9。解释清楚 kill 与 kill -9 的区别。
如何实时查看日志文件?
tail -f app.log,如果要看关键字过滤后的内容,加 grep 管道:tail -f app.log | grep ERROR。
如何批量替换文件内容?
sed -i 's/旧内容/新内容/g' 文件名,强调替换前先不加 -i 预览输出。
如何查找大文件并清理?
find / -type f -size +1G -exec ls -lh {} \; 或 du -sh * | sort -rh | head -10,找到后用 rm 清理或确认是否被进程占用。
如何后台运行脚本并保留日志?
nohup python script.py > app.log 2>&1 &,解释每个部分的含义,再补充 systemd 是生产环境的推荐方案。
8.2 区分"会用"和"理解本质"的加分项
面试中能区分层次的是对命令背后原理的理解。比如:
- 管道
|的本质:把前一个命令的标准输出接到后一个命令的标准输入,理解这一点就明白为什么能串成一条链 - 重定向
>和>>:分别是覆盖和追加,2>是标准错误重定向,2>&1是把标准错误合并到标准输出 - 命令查找顺序:
alias> 内建命令 >PATH目录下的可执行文件。这也是为什么修改PATH能影响命令版本 - 一切皆文件:在 Linux 中,普通文件、目录、设备、管道、socket 都被抽象为文件,统一用文件 API 操作,这是理解 Linux 系统的钥匙
有了这层理解,面试时哪怕遇到没见过的命令,也能通过 man 命令名 查看手册、或 命令 --help 查看帮助来现场解决问题,这比死记硬背任何命令参数都重要。
9. 从命令到工作流的进阶路径
掌握了上述命令之后,下一步是思考如何把它们串成工作流,而不仅仅是零散使用。
9.1 一个典型线上问题的完整排查实战
模拟一个真实的排查过程:Django 服务突然响应缓慢,部分请求超时。
第一步,查看系统负载和进程状态:
bash复制top
发现某个 python 进程 CPU 占用持续 150%,确认异常源头。
第二步,查看日志确认报错点:
bash复制tail -100 /var/log/app.log | grep "ERROR"
发现大量数据库连接超时。
第三步,检查依赖服务:
bash复制ss -lnt | grep 3306
MySQL 端口正常,但连接数可能过高,用 Python 一行命令快速验证:
bash复制python3 -c "import socket; s=socket.create_connection(('127.0.0.1',3306),timeout=3); print('ok')"
第四步,实时观察连接数变化:
bash复制watch -n 1 "ss -lnt | grep 3306 | wc -l"
确认连接数从几十涨到几百,最终定位到代码里连接池配置过小、请求等待排队。这一套下来,从"服务变慢"到"找到根因",全靠命令组合完成,中间不需要借助任何图形化工具。
9.2 养成"先讲命令再讲代码"的协作习惯
在团队协作中,我越来越发现一个规律:能用命令描述清楚的问题,沟通成本最低。
给同事描述 Bug,与其说"接口报错了",不如直接贴一条命令:
bash复制curl -X POST http://localhost:8000/api/x -d '{"a":1}' -v
对方复制粘贴就能复现问题,比自己开 IDE 去翻代码快得多。排查线上问题时,养成先收集命令输出、再讨论代码逻辑的习惯,能让协作效率提升不止一倍。
我自己写代码时的典型习惯是:改动一个接口后先用 curl 验证,确认没问题再交给前端。部署服务后用 systemctl status 确认运行状态,再用 tail -f 盯一会日志确保稳定。这些看起来不起眼的动作,长期积累下来能避免大量线上事故。
Linux 命令的学习是个循序渐进的过程,不需要一开始就背几百条命令。从今天文章里提到的高频命令起步,在日常开发中不断重复使用,慢慢就会内化成肌肉记忆。最后你会发现,原来觉得高大上的服务器操作,其实就是这么几个命令来回组合而已。
