程序员必备核心技能手册:从 Linux 到 Docker 的实战速查

程序员必备核心技能手册:从 Linux 到 Docker 的实战速查

框架在变,语言在变,但有些底层技能不会过时。

这篇文章整理了程序员日常最高频使用的核心技能,每个部分只讲最实用的操作,不废话。可以当速查手册用。

一、Linux 进程与会话管理

后台执行与恢复

把正在运行的 job 移到后台:

# 1. 按 Ctrl+Z 暂停当前任务
# 2. 用 bg 放到后台继续运行
bg

# 查看所有后台 job
jobs -l

# 把 job 1 拿回前台
fg %1

用 nohup 让任务在退出终端后继续运行:

nohup python3 train.py > train.log 2>&1 &

# 查看是否还在跑
ps aux | grep train.py

# 实时看日志
tail -f train.log

nohup 的作用是忽略 SIGHUP 信号。终端关闭时会向所有子进程发送 SIGHUP,nohup 让进程忽略这个信号。末尾的 & 让进程在后台启动。

用 disown 彻底脱离终端:

python3 train.py &
disown -h %1

disownnohup 更灵活——你已经忘了加 nohup 的时候,还能用 disown 救回来。

硬链接 vs 软链接

为什么需要硬链接?

硬链接和软链接(符号链接)解决不同的问题:

# 硬链接:指向同一个 inode
ln /data/model.bin /backup/model.bin

# 软链接:指向文件路径
ln -s /data/model.bin /backup/model_link

硬链接的核心用途:

  • 节省空间:不会复制文件内容,两个文件名指向同一份数据
  • 防止误删:删除原文件,硬链接仍然能访问数据(引用计数不为零,数据块不释放)
  • 原子更新:很多程序(如日志轮转、数据库 checkpoint)通过「创建新文件 → 原子 rename」来更新,硬链接保证旧文件句柄依然有效

软链接更像 Windows 的快捷方式。删了原文件,软链接就坏了(悬空链接)。

关键区别:硬链接不能跨文件系统,不能链接目录。软链接可以。

二、Git 高级操作

Branch 与 Worktree

创建分支并切换:

# 创建并切换
git checkout -b feature/login
# 或新版写法
git switch -c feature/login

# 从某个 commit 创建分支
git branch hotfix abc1234
git switch hotfix

Git Worktree(同时在多个分支上工作):

# 创建一个 worktree,在 ../feature-login 目录
git worktree add ../feature-login feature/login

# 在那个目录正常工作
cd ../feature-login
# ... 修改、提交 ...

# 回到主仓库,两边互不影响
cd -

# 列出所有 worktree
git worktree list

# 用完删掉
git worktree remove ../feature-login

Worktree 解决了一个痛点:你正在 feature/A 上开发,突然需要紧急修一个 bug。不想 stash 半成品,也不想 clone 一份仓库。Worktree 让你同时 checkout 多个分支到不同目录。

Merge vs Rebase

Merge(保留完整历史):

git switch main
git merge feature/login
# 如果有冲突,解决后
git add .
git commit

Rebase(线性历史,更干净):

git switch feature/login
git rebase main
# 如果有冲突
git add .
git rebase --continue
# 想放弃
git rebase --abort

选择原则

  • 本地分支同步最新代码 → 用 rebase(历史干净)
  • 合并 feature 到 main → 用 merge(保留分支信息,方便回溯)
  • 公共分支(main/develop)→ 永远不要 rebase(会改写别人的历史)

Restore 与 Reset

# 撤销工作区修改(未 stage)
git restore app.py
git restore --source HEAD~2 app.py   # 恢复到两个版本前

# 取消暂存(已 git add,但未 commit)
git restore --staged app.py

# 回退到上一个 commit(工作区修改保留)
git reset --soft HEAD~1

# 回退到上一个 commit(丢弃所有修改)⚠️ 危险
git reset --hard HEAD~1

# 找回误删的 commit
git reflog
git reset --hard abc1234

三、Python 并发:多进程与队列

multiprocessing 基础

from multiprocessing import Process, Queue, Pool
import os

def worker(name, q):
    result = f"{name} running in PID {os.getpid()}"
    q.put(result)

if __name__ == "__main__":
    q = Queue()
    processes = []
    for i in range(4):
        p = Process(target=worker, args=(f"worker-{i}", q))
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

    while not q.empty():
        print(q.get())

进程池 + Map 模式

from multiprocessing import Pool

def process_file(filename):
    # 处理单个文件
    return f"processed {filename}"

if __name__ == "__main__":
    files = ["a.csv", "b.csv", "c.csv", "d.csv"]
    with Pool(processes=4) as pool:
        results = pool.map(process_file, files)
    print(results)

Producer-Consumer 模式

from multiprocessing import Process, Queue
import time

def producer(q):
    for i in range(10):
        q.put(f"task-{i}")
        time.sleep(0.1)
    q.put(None)  # sentinel

def consumer(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(f"processing {item}")

if __name__ == "__main__":
    q = Queue(maxsize=5)
    p = Process(target=producer, args=(q,))
    c = Process(target=consumer, args=(q,))
    p.start()
    c.start()
    p.join()
    c.join()

什么时候用多进程而非多线程:Python 有 GIL,CPU 密集型任务用多线程没有加速效果。多进程是真正利用多核的方式。I/O 密集型任务(网络请求、文件读写)用多线程或 asyncio 就够了。

四、GitHub Actions 工作流

基本结构

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - run: pip install -r requirements.txt
      - run: pytest
      - run: ruff check .

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - run: echo "deploying..."

常用触发条件

on:
  schedule:
    - cron: "0 6 * * *"    # 每天早上 6 点
  workflow_dispatch:         # 手动触发
  push:
    tags: ["v*"]             # 打 tag 时触发

Secrets 和环境变量

steps:
  - name: Deploy
    env:
      API_KEY: ${{ secrets.API_KEY }}
    run: |
      curl -H "Authorization: Bearer $API_KEY" \
        https://api.example.com/deploy

五、DevOps 与 CI/CD 核心概念

CI/CD 是什么

  • CI(持续集成):每次代码提交自动触发构建和测试,尽早发现问题
  • CD(持续交付):通过所有测试的代码自动部署到预发环境
  • CD(持续部署):进一步自动化,直接部署到生产环境

用 Jenkins API 控制任务

Jenkins 提供 REST API,可以在脚本中触发、查询和管理 Job。

# 触发构建
curl -X POST "https://jenkins.example.com/job/my-project/build" \
  --user "username:api_token"

# 带参数触发
curl -X POST "https://jenkins.example.com/job/my-project/buildWithParameters" \
  --user "username:api_token" \
  --data "BRANCH=feature/login&ENV=staging"

# 查询构建状态
curl "https://jenkins.example.com/job/my-project/lastBuild/api/json" \
  --user "username:api_token" | jq '.result'

# 获取构建日志
curl "https://jenkins.example.com/job/my-project/lastBuild/consoleText" \
  --user "username:api_token"

# 列出所有 Job
curl "https://jenkins.example.com/api/json?pretty=true" \
  --user "username:api_token" | jq '.jobs[].name'

API Token 在 Jenkins 个人设置页面生成:用户 → 配置 → API Token → 添加新 Token。

六、Docker 与 Docker Compose

构建、运行、清理

构建镜像:

# 用 Dockerfile 构建并打 tag
docker build -t myapp:v1 .

# 查看本地镜像
docker images

# 查看镜像构建历史(排查镜像大小问题)
docker history myapp:v1

运行容器:

# 后台运行,映射端口,挂载目录
docker run -d \
  --name myapp \
  -p 8080:80 \
  -v $(pwd)/data:/app/data \
  myapp:v1

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 进入容器调试
docker exec -it myapp /bin/bash

# 查看容器日志
docker logs -f myapp

# 停止并删除容器
docker stop myapp
docker rm myapp

删除镜像:

# 删除指定镜像
docker rmi myapp:v1

# 强制删除(即使有容器引用)
docker rmi -f myapp:v1

# 清理所有未使用的镜像、容器、网络
docker system prune -a

Dockerfile 最佳实践

FROM python:3.11-slim

WORKDIR /app

# 先复制依赖文件,利用缓存层
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 再复制源码
COPY . .

EXPOSE 8080
CMD ["python", "main.py"]

关键点:把 requirements.txt 单独 COPY 再 RUN pip install,这样源码变了不会重新安装依赖。Docker 层缓存只在该层及之后失效。

Docker Compose 编排多服务

# docker-compose.yml
version: "3.8"
services:
  web:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
      - redis
    environment:
      - DB_HOST=db
      - REDIS_HOST=redis

  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  pgdata:
# 启动所有服务(后台)
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f web

# 重新构建并启动
docker compose up -d --build

# 停止并删除所有容器
docker compose down

# 停止并删除容器 + 数据卷
docker compose down -v

七、补充:其他高频技能

SSH 免密登录

# 生成密钥对
ssh-keygen -t ed25519

# 复制公钥到服务器
ssh-copy-id user@server

# 配置快捷别名(~/.ssh/config)
Host myserver
    HostName 192.168.1.100
    User deploy
    IdentityFile ~/.ssh/id_ed25519

# 之后直接
ssh myserver

屏幕复用:tmux

# 新建会话
tmux new -s work

# 分离会话(不中断)
# 按 Ctrl+B 然后按 D

# 列出会话
tmux ls

# 重新连接
tmux attach -t work

# 水平分屏
# Ctrl+B 然后按 "
# 垂直分屏
# Ctrl+B 然后按 %

tmux 比 nohup 更适合长期运行的任务——你可以随时重新连接查看输出。

快速分析日志

# 统计 HTTP 状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# 找出最频繁的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

# 按时间范围过滤
awk '$4 >= "[22/May/2026:06:00" && $4 < "[22/May/2026:12:00"' access.log

# 实时监控并高亮关键词
tail -f app.log | grep --color -E "ERROR|FAIL|^"

这些技能不会出现在任何招聘 JD 的"必备要求"里,但它们是每天都会用到的基本功。建议收藏备用,需要的时候直接查。


作者: itech001
来源: 公众号:AI人工智能时代
网站: https://www.theaiera.cn/
每日分享最前沿的AI新闻资讯和技术研究。

关注公众号,获取更多 AI 技术干货!

posted @ 2026-05-22 08:13  iTech  阅读(5)  评论(0)    收藏  举报