Linux与工程化工具

生信工程师必备技能速查 — 面试高频考点 + 实战命令

技能矩阵总览

简历涵盖的 6 大工程化方向,每个都是生信面试高频考点

🐧
Linux / Shell
Ubuntu / CentOS
🐍
Snakemake
流程管理 (v8/v9)
🐳
Docker
容器化部署
📦
conda / mamba
环境管理
🔀
Git / GitHub
版本控制
🖥️
HPC 集群
SLURM / PBS
Linux
Git
conda
Snakemake
Docker
HPC

典型技能学习路径:先 Linux 基础 → Git 管理代码 → conda 管理环境 → Snakemake 编排流程 → Docker 容器化 → HPC 集群跑大规模分析

01 Linux 高频命令速查 核心基础

文件操作

# 列出文件(长格式 + 人类可读大小 + 按时间排序) ls -lhrt # 复制文件/目录 cp file.txt backup/ # 复制文件 cp -r dir1/ dir2/ # 递归复制目录 # 移动/重命名 mv old_name.txt new_name.txt # 删除(慎用!) rm file.txt # 删除文件 rm -rf directory/ # 递归强制删除目录 # 查找文件 find /data -name "*.fastq.gz" -size +1G # 找大于1G的fastq文件 locate "sample01.bam" # 快速定位(需先 updatedb)

文本处理(生信最常用)

# grep — 文本搜索 grep "gene_id" annotation.gtf # 搜索含 gene_id 的行 grep -c "^>" sequences.fa # 统计 FASTA 序列条数 grep -v "^#" results.vcf # 排除注释行 # awk — 列处理神器 awk '{print $1, $4, $5}' file.bed # 提取第1/4/5列 awk -F'\t' '$3 > 100' counts.tsv # 筛选第3列大于100的行 awk '{sum+=$2} END{print sum}' file.txt # 对第2列求和 # sed — 流编辑器 sed 's/old/new/g' file.txt # 全局替换 sed -n '10,20p' file.txt # 打印第10-20行 # cut / sort / uniq / wc — 常用组合 cut -f1,3 data.tsv # 提取第1和第3列(tab分隔) sort -k2,2n file.tsv # 按第2列数值排序 sort file.txt | uniq -c | sort -rn # 统计出现频率并降序排列 wc -l file.txt # 统计行数

生信专用命令组合

# 统计 FASTQ 文件的 reads 数 echo $(cat sample.fq | wc -l)/4 | bc # 原理:FASTQ 每条 read 占 4 行(header + seq + + + quality) # 提取 FASTA 序列 ID grep "^>" sequences.fa | sed 's/^>//' # 统计 GC 含量 grep -v "^>" genome.fa | tr -d '\n' | \ awk '{total=length($0); gc=gsub(/[GCgc]/,""); print gc/total*100 "%"}' # 按列排序 TSV 文件(按第3列数值降序) sort -t$'\t' -k3,3nr results.tsv | head -20 # 统计 BAM 文件比对率(需 samtools) samtools flagstat aligned.bam | grep "mapped ("

系统监控与进程管理

# 系统监控 top # 实时进程监控 htop # 增强版 top(更好看) df -h # 查看磁盘空间 du -sh /data/* # 查看各目录大小 free -h # 查看内存使用 # 进程管理 ps aux | grep fastp # 查找 fastp 进程 kill -9 12345 # 强制终止进程 nohup snakemake --cores 8 & # 后台运行,退出终端不中断 # screen / tmux(远程必备) screen -S analysis # 创建名为 analysis 的会话 screen -r analysis # 重新连接会话 tmux new -s pipeline # tmux 创建会话 tmux attach -t pipeline # tmux 重新连接

面试笔试常考题

以下 5 道题在生信面试笔试中出现频率极高,务必能手写出来。

题1:统计文件中第2列的唯一值个数

awk '{print $2}' file.tsv | sort -u | wc -l

题2:找出两个文件的共有行

comm -12 <(sort file1.txt) <(sort file2.txt)

题3:提取 FASTA 中序列长度大于 1000bp 的序列名

awk '/^>/{name=$0; next} length($0)>1000{print name}' sequences.fa

题4:统计 VCF 文件中每条染色体的变异数

grep -v "^#" variants.vcf | cut -f1 | sort | uniq -c | sort -rn

题5:将 tab 分隔文件转为 CSV

sed 's/\t/,/g' data.tsv > data.csv
02 Snakemake 流程管理 流程编排

核心概念

概念白话解释类比
rule一个分析步骤的定义(输入 → 处理 → 输出)菜谱中的一道菜
input / output规则需要的文件和产生的文件原料和成品
wildcard通配符,自动匹配样本名模板中的 {占位符}
DAG有向无环图,Snakemake 自动推断步骤依赖关系做菜顺序表
conda:每个 rule 可指定独立 conda 环境每道菜用专用锅具
threads分配给 rule 的 CPU 核数同时几个人一起做

真实 Snakefile 示例(简化版 T2D 双轨流水线)

# Snakefile — T2D 宏基因组双轨流水线(简化版) SAMPLES = ["T2D_01", "T2D_02", "T2D_03", "HC_01", "HC_02", "HC_03"] # 最终目标:所有样本的功能注释结果 rule all: input: expand("results/humann/{sample}_pathabundance.tsv", sample=SAMPLES), expand("results/metaphlan/{sample}_profile.txt", sample=SAMPLES) # Step 1: fastp 质控 rule fastp_qc: input: r1 = "raw/{sample}_R1.fq.gz", r2 = "raw/{sample}_R2.fq.gz" output: r1 = "clean/{sample}_R1.fq.gz", r2 = "clean/{sample}_R2.fq.gz", html = "qc_reports/{sample}_fastp.html" threads: 4 conda: "envs/qc.yaml" shell: """ fastp -i {input.r1} -I {input.r2} \ -o {output.r1} -O {output.r2} \ --html {output.html} \ --thread {threads} """ # Step 2: 去宿主(bowtie2 比对人类基因组后提取未比对reads) rule remove_host: input: r1 = "clean/{sample}_R1.fq.gz", r2 = "clean/{sample}_R2.fq.gz" output: r1 = "host_removed/{sample}_R1.fq.gz", r2 = "host_removed/{sample}_R2.fq.gz" threads: 8 shell: """ bowtie2 -x /ref/human_genome -1 {input.r1} -2 {input.r2} \ --un-conc-gz host_removed/{wildcards.sample}_R%.fq.gz \ -p {threads} -S /dev/null """ # Track A: MetaPhlAn 物种注释 rule metaphlan: input: r1 = "host_removed/{sample}_R1.fq.gz", r2 = "host_removed/{sample}_R2.fq.gz" output: "results/metaphlan/{sample}_profile.txt" threads: 8 conda: "envs/metaphlan.yaml" shell: """ metaphlan {input.r1},{input.r2} \ --input_type fastq --nproc {threads} \ -o {output} """ # Track B: HUMAnN 功能注释 rule humann: input: r1 = "host_removed/{sample}_R1.fq.gz", r2 = "host_removed/{sample}_R2.fq.gz" output: "results/humann/{sample}_pathabundance.tsv" threads: 8 conda: "envs/humann.yaml" shell: """ cat {input.r1} {input.r2} | \ humann --input /dev/stdin --output results/humann/ \ --output-basename {wildcards.sample} --threads {threads} """

常用 Snakemake 命令

# 干运行(检查规则逻辑,不实际执行) snakemake -n # 正式运行(8个核) snakemake --cores 8 # 使用 conda 环境(v8+ 新语法) snakemake --cores 8 --software-deployment-method conda # 生成 DAG 可视化 snakemake --dag | dot -Tpng > dag.png # 生成执行报告 snakemake --report report.html
Snakemake 8.0+ 的重要变化:
1. 推荐使用 --software-deployment-method conda--use-conda 仍可用作兼容别名)
2. --use-singularity 改为 --software-deployment-method apptainer
3. 移除了 dynamic(用 checkpoints 替代)、versionsubworkflow 指令
4. Remote providers 被 storage plugins 替代
5. 当前最新版本为 Snakemake 9.20+,引入了插件架构

Snakemake vs Shell 脚本对比

特性Shell 脚本Snakemake
依赖管理手动控制执行顺序自动推断 DAG 依赖
断点续跑需自己实现自动跳过已完成步骤
并行执行需 GNU parallel 等工具内置并行(--cores)
多样本处理需写循环wildcard 自动展开
环境隔离conda: 指令按 rule 隔离
可重复性高(配置即文档)
集群提交手动写 sbatch 脚本--executor slurm 自动分发
回答"Snakemake 的优势"时,抓住 3 个关键词:自动依赖推断(DAG)、断点续跑(只重算变化的部分)、可重复性(Snakefile 即文档)。结合你 T2D 项目说:"我的流水线有约 5-6 个 rule,从 fastp 质控到 MetaPhlAn/HUMAnN 双轨注释,Snakemake 让我一键跑 6 个样本的全流程。"
03 Docker 容器 容器化

核心概念

概念白话解释类比
镜像 (Image)只读模板,包含操作系统 + 软件 + 配置安装光盘
容器 (Container)镜像的运行实例,可以修改但默认不持久从光盘安装后跑起来的虚拟机
Dockerfile构建镜像的配方文件安装说明书
Registry镜像仓库(Docker Hub / BioContainers)应用商店
Volume (-v)宿主机和容器之间共享的目录插在虚拟机上的 U 盘

常用命令速查

# 拉取镜像(BioContainers 是生信专用镜像库) docker pull biocontainers/fastp:v0.23.4_cv1 docker pull biocontainers/samtools:v1.9-4-deb_cv1 # 运行容器(-v 挂载数据目录) docker run -v /home/user/data:/data biocontainers/fastp:v0.23.4_cv1 \ fastp -i /data/sample_R1.fq.gz -I /data/sample_R2.fq.gz \ -o /data/clean_R1.fq.gz -O /data/clean_R2.fq.gz # 交互式进入容器 docker run -it --rm ubuntu:22.04 /bin/bash # 查看运行中的容器 docker ps # 查看所有容器(包括停止的) docker ps -a # 停止 / 删除容器 docker stop <container_id> docker rm <container_id> # 查看本地镜像 docker images # 删除镜像 docker rmi <image_id> # 构建自定义镜像 docker build -t my-pipeline:v1.0 .

Dockerfile 生信示例

# Dockerfile — 构建一个包含常用生信工具的镜像 FROM ubuntu:22.04 # 安装系统依赖 RUN apt-get update && apt-get install -y \ wget curl git \ python3 python3-pip \ samtools bedtools \ && rm -rf /var/lib/apt/lists/* # 安装 Python 生信工具 RUN pip3 install pandas numpy biopython # 设置工作目录 WORKDIR /analysis # 复制分析脚本 COPY scripts/ /analysis/scripts/ # 默认命令 CMD ["bash"]

Docker vs conda 对比

维度Dockerconda
隔离级别操作系统级(完全隔离)Python/包级(共享 OS)
可移植性极高(任何有 Docker 的机器都能跑)中等(有时 OS 差异导致问题)
体积较大(包含整个 OS 层)较小(只装包)
学习成本中等
集群支持部分 HPC 禁止 Docker(安全原因)广泛支持
替代方案Singularity/Apptainer(HPC 友好)mamba(加速版)
适用场景部署、CI/CD、跨平台交付日常开发、快速安装工具
很多 HPC 集群不允许 Docker(因为 Docker 需要 root 权限),此时用 Singularity / Apptainer 替代。它可以直接拉取 Docker 镜像:
singularity pull docker://biocontainers/fastp:v0.23.4_cv1
面试回答"为什么用 Docker"三句话模板:
1. 可重复性:同事拉同一个镜像,结果一模一样;
2. 环境隔离:不会和服务器上其他软件冲突;
3. 集群场景用 Singularity:HPC 不能跑 Docker,但可以转成 Singularity 镜像。
04 conda / mamba 环境管理 环境管理

核心命令速查

# 创建环境 conda create -n bioinfo python=3.10 # 创建名为 bioinfo 的环境 mamba create -n qc_tools python=3.10 # mamba 创建(更快) # 激活/退出环境 conda activate bioinfo conda deactivate # 安装包 conda install -c bioconda -c conda-forge fastp samtools mamba install -c bioconda metaphlan # mamba 安装更快 # 查看环境列表 conda env list # 导出环境(可重复性关键!) conda env export > environment.yml # 从 yml 文件创建环境 conda env create -f environment.yml # 删除环境 conda env remove -n old_env # 查看某环境已装的包 conda list -n bioinfo

最佳实践

实践原因
每个项目一个环境避免不同项目的包版本冲突
用 environment.yml 记录环境同事可以一键重建相同环境
用 mamba 替代 condaC++ 实现的 libsolv 求解器,速度快 10-100 倍
channel 优先级:conda-forge > bioconda > defaultsconda-forge 和 bioconda 包更全更新
指定包版本例如 samtools=1.18,防止不可预期升级

conda vs mamba 对比

维度condamamba
实现语言PythonC++ (libsolv)
依赖求解速度慢(大环境可能数小时)快 10-100 倍
下载方式顺序下载并行下载
兼容性原生完全兼容 conda 生态
安装方式Anaconda / Minicondaconda install mamba / Miniforge
最小安装Miniconda ~80MBMicromamba ~13MB
回答"你怎么管理分析环境":
"我用 conda/mamba 管理,每个项目建独立环境(比如 t2d_ml 做机器学习、bioinfo 做宏基因组分析、qc_tools 做质控),用 environment.yml 导出配置保证可重复性。安装包时优先用 mamba,因为它用 C++ 的 libsolv 求解器,比 conda 快很多。channel 优先级设为 conda-forge > bioconda。"

常见报错与解决

PackagesNotFoundError:包名拼错或没加正确 channel。解决:mamba search <包名> 确认包名,加 -c bioconda -c conda-forge

ResolvePackageNotFound:当前平台不支持该版本。解决:不指定具体版本试试,或用 Docker 替代。

版本冲突 (UnsatisfiableError):两个包依赖的同一库版本不兼容。解决:拆分为两个环境,分别安装。
05 Git 版本控制 版本管理

核心工作流

git init
git add
git commit
git push
git pull

常用命令速查表

# 初始化与配置 git init # 初始化仓库 git clone https://github.com/user/repo.git # 克隆远程仓库 git config --global user.name "彭文强" git config --global user.email "xxx@xxx.com" # 日常操作 git status # 查看当前状态 git add script.py # 暂存单个文件 git add . # 暂存所有修改 git commit -m "feat: 添加物种丰度分析脚本" # 提交 git push origin main # 推送到远程 git pull origin main # 拉取远程更新 # 分支操作 git branch # 查看分支 git checkout -b feature/add-humann # 创建并切换新分支 git checkout main # 切换回 main git merge feature/add-humann # 合并分支 git branch -d feature/add-humann # 删除已合并分支 # 查看历史 git log --oneline --graph # 简洁图形化日志 git diff # 查看未暂存的修改 git diff --staged # 查看已暂存的修改 # 撤销操作 git restore file.py # 丢弃工作区修改(Git 2.23+) git reset --soft HEAD~1 # 撤销上次提交(保留修改) # 暂存工作 git stash # 临时保存当前修改 git stash pop # 恢复暂存的修改

.gitignore 生信模板

# .gitignore — 生物信息学项目模板 # 大文件(不要提交到 Git!) *.fastq.gz *.fq.gz *.bam *.sam *.bcf *.vcf.gz *.sra # 参考基因组和索引 *.fa *.fasta *.bt2 *.bwt *.fai # 中间文件 *.tmp *.log *.err # Python __pycache__/ *.pyc .ipynb_checkpoints/ # conda .conda/ # IDE .vscode/ .idea/ # 系统文件 .DS_Store Thumbs.db
面试回答"你用 Git 管理过什么项目":
"我用 Git 管理我的 T2D 宏基因组分析项目和面试准备代码。Snakemake 流水线、R 分析脚本都在 GitHub 上。大文件(fastq、bam)通过 .gitignore 排除,只提交代码和配置文件。提交信息遵循 conventional commit 格式,比如 feat: 添加差异丰度分析fix: 修复样本分组错误。"
06 HPC 集群使用 (SLURM / PBS) 高性能计算

SLURM 基础命令

# 提交作业 sbatch job_script.sh # 提交批处理作业 # 查看作业队列 squeue -u $USER # 查看自己的作业 squeue -p gpu # 查看 gpu 分区的作业 # 取消作业 scancel <job_id> # 取消指定作业 scancel -u $USER # 取消自己所有作业 # 查看集群状态 sinfo # 查看节点和分区状态 sacct -j <job_id> # 查看作业历史资源使用 # 交互式作业(调试用) srun --pty -c 4 --mem=8G -t 1:00:00 bash # 申请 4 核 8G 内存 1 小时

SLURM 提交脚本模板(生信分析)

#!/bin/bash #SBATCH --job-name=fastp_qc # 作业名称 #SBATCH --partition=normal # 分区/队列 #SBATCH --cpus-per-task=8 # 每个任务 8 个 CPU 核 #SBATCH --mem=16G # 内存 16GB #SBATCH --time=02:00:00 # 最长运行 2 小时 #SBATCH --output=logs/%j_%x.out # 标准输出(%j=作业ID, %x=作业名) #SBATCH --error=logs/%j_%x.err # 错误输出 #SBATCH --mail-type=END,FAIL # 完成或失败时发邮件 #SBATCH --mail-user=your@email.com # 邮箱 # 加载 conda 环境(推荐写法,兼容性好) source $(conda info --base)/etc/profile.d/conda.sh conda activate bioinfo # 或者: module load fastp/0.23.4 # 执行分析 fastp -i raw/${SAMPLE}_R1.fq.gz -I raw/${SAMPLE}_R2.fq.gz \ -o clean/${SAMPLE}_R1.fq.gz -O clean/${SAMPLE}_R2.fq.gz \ --thread $SLURM_CPUS_PER_TASK \ --html qc_reports/${SAMPLE}_fastp.html echo "Job finished at $(date)"

SLURM 数组作业(多样本批量提交)

#!/bin/bash #SBATCH --job-name=batch_qc #SBATCH --array=1-6 # 6 个样本,编号 1-6 #SBATCH --cpus-per-task=4 #SBATCH --mem=8G #SBATCH --time=01:00:00 #SBATCH --output=logs/%A_%a.out # %A=数组主ID, %a=子任务ID # 从样本列表文件中读取样本名 SAMPLE=$(sed -n "${SLURM_ARRAY_TASK_ID}p" samples.txt) echo "Processing sample: ${SAMPLE}" fastp -i raw/${SAMPLE}_R1.fq.gz -I raw/${SAMPLE}_R2.fq.gz \ -o clean/${SAMPLE}_R1.fq.gz -O clean/${SAMPLE}_R2.fq.gz \ --thread $SLURM_CPUS_PER_TASK

PBS vs SLURM 对比

操作SLURMPBS/Torque
提交作业sbatch script.shqsub script.sh
查看队列squeueqstat
取消作业scancel <id>qdel <id>
交互式srun --pty bashqsub -I
指定 CPU#SBATCH --cpus-per-task=8#PBS -l ncpus=8
指定内存#SBATCH --mem=16G#PBS -l mem=16gb
指定时间#SBATCH --time=02:00:00#PBS -l walltime=02:00:00
作业 ID 变量$SLURM_JOB_ID$PBS_JOBID
回答"你用过集群吗?怎么提交任务?":
"用过 SLURM 集群。单个任务用 sbatch 提交脚本,脚本里指定 CPU、内存、时间等资源。多样本批量分析用 --array 数组作业,一条命令提交所有样本。也可以用 Snakemake 的 --executor slurm 参数,让 Snakemake 自动为每个 rule 生成和提交 SLURM 脚本。"
07 面试 Q&A 精选 面试必备
你最常用的 Linux 命令是什么?
答题模板:日常最常用的是文本处理三剑客 grepawksed
比如我做宏基因组分析时,经常用 grep -c "^>" 统计 FASTA 序列数,用 awk 按列提取和筛选 TSV 数据,用 sed 做批量文本替换。
管道操作也很常用,比如 cut -f1 | sort | uniq -c | sort -rn 统计某列的出现频率。
远程分析时离不开 screentmux,保证 SSH 断开后任务不中断。
Snakemake 相比 shell 脚本有什么优势?
答题模板:Snakemake 有三个核心优势:
1. 自动依赖推断:通过 DAG(有向无环图)自动确定步骤执行顺序,不需要手动管理先后关系。
2. 断点续跑:如果某个步骤失败,修复后只重跑失败的部分,已完成的不重复执行。Shell 脚本做不到这点。
3. 内置并行--cores 8 就能自动并行跑独立的步骤,Shell 脚本需要额外用 GNU parallel。
在我的 T2D 项目中,用 Snakemake 管理从质控到 MetaPhlAn/HUMAnN 双轨注释的全流程,一键处理 6 个样本。
此外,Snakemake 8.0+ 还引入了插件架构,支持直接用 --executor slurm 在集群上分发任务。
Docker 和 conda 怎么选?
答题模板:两者互补,不是二选一:
- 日常开发用 conda/mamba:轻量、安装快、HPC 集群友好,适合快速搭建分析环境。
- 交付和部署用 Docker:完全隔离,保证任何机器上结果一致,适合发表论文或交付给合作者。
- HPC 集群用 Singularity/Apptainer:Docker 需要 root 权限,大多数 HPC 不允许。Singularity 可以直接转换 Docker 镜像。
在 Snakemake 中可以用 conda: 指令按 rule 指定 conda 环境,也可以用 container: 指令指定 Docker/Singularity 容器。
怎么在集群上跑一个多样本的分析流程?
答题模板:有两种常用方式:
1. SLURM 数组作业:用 --array=1-N 参数,每个子任务通过 $SLURM_ARRAY_TASK_ID 读取对应样本名,一条 sbatch 命令就能并行处理所有样本。
2. Snakemake + SLURM 集成:用 snakemake --executor slurm(v8+),Snakemake 自动为每个 rule 生成提交脚本,管理依赖关系,更优雅。
资源方面,通过 #SBATCH --cpus-per-task--mem--time 合理分配,避免资源浪费。用 sacct 查看历史作业的实际资源消耗来调优。
你用 Git 管理代码吗?工作流是什么?
答题模板:是的,我用 Git + GitHub 管理所有分析代码。工作流如下:
1. git init 初始化项目,设置 .gitignore 排除大文件(.fastq.gz、.bam 等)。
2. 日常开发在功能分支上,比如 feature/add-humann-analysis
3. 提交信息用 conventional commit 格式:feat:(新功能)、fix:(修 bug)、refactor:(重构)。
4. 完成后合并到 main 分支,推送到 GitHub。
这样保证代码有版本历史,方便回溯和协作。
你怎么保证分析的可重复性?
答题模板:从四个层面保证:
1. 代码版本控制:Git 管理所有脚本,每次分析对应一个 commit。
2. 环境可重现:conda 导出 environment.yml,或者提供 Docker 镜像。
3. 流程自动化:Snakemake 定义完整 pipeline,一键从头到尾重跑。
4. 数据记录:记录原始数据来源、参考数据库版本、关键参数设置。
这四点组合在一起,任何人拿到我的代码和数据,都能复现结果。
你遇到过软件安装失败怎么解决的?
答题模板:常见套路是"三步排查":
1. 先看错误信息:conda 的 PackagesNotFoundError 通常是 channel 没加对,加 -c bioconda -c conda-forge 试试。
2. 换 mamba:如果 conda 求解依赖太慢或失败,用 mamba 替代,它的 C++ 求解器更快更好。
3. 终极方案用 Docker:如果包和系统库冲突实在解决不了,直接拉 BioContainers 的镜像跑。
另外,给不同工具建独立 conda 环境也能有效避免版本冲突。

工具选型速查矩阵

场景 推荐工具 原因
日常包管理 mamba (conda) 轻量、快速、bioconda 生态完善
流程编排 Snakemake DAG 依赖推断 + 断点续跑 + 集群集成
环境交付 Docker / Singularity 完全隔离,保证可重复性
代码管理 Git + GitHub 版本追踪、协作、备份
大规模计算 SLURM + Snakemake 自动资源调度,数组作业批量处理
文本处理 awk + grep + sed Linux 原生,处理 TSV/FASTA/VCF 效率极高

Linux与工程化工具速查 | 彭文强 面试准备 | 2026