Toolbox
持续收集的一些技巧
1 aria2
aria2c \
-x 32 \ # 最大连接数增加到32
-s 32 \ # 分段数增加到32
-k 10M \ # 每个分段大小10MB
-j 32 \ # 最大并发下载任务数
--max-download-limit=0 \ # 不限制总下载速度
--file-allocation=prealloc \ # 预分配文件空间
--continue=true \ # 断点续传
--max-tries=5 \ # 最大重试次数
--retry-wait=10 \ # 重试间隔10秒
--auto-file-renaming=true \ # 自动重命名
--allow-overwrite=true \ # 允许覆盖已存在文件
http://huttenhower.sph.harvard.edu/kneadData_databases/Homo_sapiens_hg37_and_human_contamination_Bowtie2_v0.1.tar.gz
aria2c -x 32 -s 32 -k 10M -j 32 --max-download-limit=0 --file-allocation=prealloc --continue=true --max-tries=5 --retry-wait=10 --auto-file-renaming=true --allow-overwrite=true
aria2c -x 16 -s 16 -k 10M -j 32 --max-download-limit=0 --file-allocation=prealloc --continue=true --max-tries=5 --retry-wait=10 --auto-file-renaming=true --allow-overwrite=true
2 conda本地
- 直接使用conda本地安装
conda install --use-local /path/to/linux-64/aria2-1.37.0-hbc8128a_2.conda
- 如果想添加到特定环境
# 激活目标环境
conda activate your_environment_name
# 安装
conda install --use-local /path/to/linux-64/aria2-1.37.0-hbc8128a_2.conda
- 如果遇到问题,可以尝试
# 先验证文件
conda install -n base conda-build
conda index /path/to/directory/containing/conda/file
# 然后安装
conda install --use-local aria2
- 备选方案:使用pip
pip install aria2c
推荐按顺序尝试这些方法。第一种方法通常最直接和有效。
3 bowtie2构建ref
- 多个参考库,建议:
kneaddata --input sample_R1.fastq.gz --input sample_R2.fastq.gz -db $DB1 -db $DB2
-
构建参考库,也可以逗号分隔fastq文件
-
可以使用 bowtie2-inspect 将 bt2 索引转换为 fasta 序列,然后使用它来构建组合索引
4 SSH反向隧道(Remote Forwarding)
- 首先在内网服务器建立到外网的SSH连接
# 内网发起
ssh -R 8022:localhost:22 外网用户名@外网服务器IP
这样外网服务器会开放8022端口,通过该端口可以:(选择 49152 - 65535 范围内的端口,这些端口通常是不被系统自带服务使用的。netstat -tuln查看后选择)
# 外网向内网传文件
sftp -P 8022 localhost
# 或
scp -P 8022 要传输的文件 localhost:目标路径
config配置:
Host host_name
HostName <ip>
User <username>
RemoteForward 8022 localhost:22
Port <port>
IdentityFile ~/.ssh/id_ed25519
ssh -CNfg host_name #建立隧道
ssh -p <port, exp:8022> <localuse>r@localhost
win:
tasklist | findstr ssh
taskkill /PID <pid> /F
linux:
netstat -tuln
连接:
ssh -p <远程端口> <username>@localhost
sftp -P <远程端口> <username>@localhost
5 sftp和ssh的单行命令
有些时候我们不想以交互式的命令来执行sfto和ssh,此时就可以单行进行使用,在此简单提示一下吧:
sftp
sftp username@host.com <<EOF
lcd /local/directory
cd /remote/directory
put localfile.txt
get remotefile.txt
bye
EOF
sftp -b commands.txt username@host.com # -b指定命令文件
sftp username@host.com <<< "lcd /local/directory; cd /remote/directory; put localfile.txt; get remotefile.txt; bye"
ssh
ssh username@host.com "cd /remote/directory; ls -l; pwd"
ssh username@host.com 'bash -s' < script.sh # 如果你有多个命令存储在一个脚本文件中,也可以通过 SSH 执行该脚本
ssh -t username@host.com "cd /remote/directory; ls -l; exit" # -t强制分配伪终端
6 snakemake与sftp
请看成功的简单案例:
(snakemake) [acgecuxr3d@login10 sftp_test]$ tree
.
├── logs
│ └── sftp.log
├── Snakefile
├── test
└── test.successful
1 directory, 4 files
Snakefile:
localrules:
sftp_test,
rule all:
input:
"test.successful"
rule sftp_test:
input:
"test"
output:
touch("test.successful")
log:
"logs/sftp.log"
shell:
"sftp -P 51705 limingyang@localhost <<< 'put -r /work/home/acgecuxr3d/sftp_test/{input} /D:/lmy/002_done exit'"
注意需要先在本地打开ssh反向隧道
7 环境变量的检查与添加
PATH 环境变量:
echo $PATH
手动将其某个路径添加到你的 ~/.bashrc 或 ~/.bash_profile 文件中:
export PATH=~/miniconda3/bin:$PATH
然后,运行以下命令以使更改生效:
source ~/.bashrc
或
source ~/.bash_profile
永久生效的方法:
- 对于 Bash shell(
~/.bashrc):
echo 'export PATH=~/miniconda3/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
- 对于 Zsh shell(
~/.zshrc):
echo 'export PATH=~/miniconda3/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
- 对于 Fish shell(
~/.config/fish/config.fish):
echo 'set -gx PATH ~/miniconda3/bin $PATH' >> ~/.config/fish/config.fish
source ~/.config/fish/config.fish
8 解压
在 Linux 中,常用的解压命令取决于压缩文件的格式:
1. tar 家族
# .tar 普通压缩包
tar -xvf file.tar
# .tar.gz 或 .tgz
tar -xzvf file.tar.gz
# .tar.bz2
tar -xjvf file.tar.bz2
# .tar.xz
tar -xJvf file.tar.xz
2. zip 压缩包
# .zip 文件
unzip file.zip
# 解压到指定目录
unzip file.zip -d /path/to/directory
3. gz 压缩
# .gz 文件
gunzip file.gz
# 或
gzip -d file.gz
4. bz2 压缩
# .bz2 文件
bunzip2 file.bz2
# 或
bzip2 -d file.bz2
5. 7z 压缩
# 需要先安装 7zip
sudo apt-get install p7zip-full # Ubuntu/Debian
7z x file.7z
参数解释
-x:解压-v:显示详细信息-f:指定文件-z:gzip压缩-j:bzip2压缩-J:xz压缩
建议
- 不确定压缩包类型时,可以使用
file filename命令查看 - 使用
-C指定解压目录:tar -xzvf file.tar.gz -C /target/directory
9 网络测试
除了使用ping进行测试网络延迟外,还可以conda下载测试包:
# 安装
conda install -c conda-forge speedtest-cli
# 测试
speedtest-clixxxxxxxxxx # 安装 conda install -c conda-forge speedtest-cli # 测试 speedtest-clispeedtest-cli
结果如下(垃圾网速望周知):
Retrieving speedtest.net configuration...
Testing from China Mobile (111.21.171.11)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by CT-MACAU (Macau) [1418.84 km]: 367.626 ms
Testing download speed................................................................................
Download: 2.87 Mbit/s
Testing upload speed......................................................................................................
Upload: 2.89 Mbit/s
用法: speedtest-cli [选项]
命令行网络测速工具 (使用 speedtest.net)
--------------------------------------------------------------------------
项目地址: https://github.com/sivel/speedtest-cli
可选参数:
-h, --help 显示帮助信息并退出
网络测试控制:
--no-download 不执行下载速度测试
--no-upload 不执行上传速度测试
--single 仅使用单一连接。模拟典型文件传输场景
输出格式:
--bytes 以字节显示数值(而非比特)
--share 生成并提供speedtest.net结果图像的URL
--simple 精简输出,仅显示基本信息
数据格式选项:
--csv 以CSV格式输出基本信息
--csv-delimiter CSV分隔符(默认为逗号)
--csv-header 显示CSV表头
--json 以JSON格式输出基本信息
服务器选择:
--list 显示按距离排序的speedtest服务器列表
--server SERVER 指定测试的服务器ID(可多次使用)
--exclude EXCLUDE 排除特定服务器(可多次使用)
--mini MINI Speedtest Mini服务器URL
高级选项:
--source SOURCE 绑定的源IP地址
--timeout TIMEOUT HTTP超时时间(秒),默认10秒
--secure 使用HTTPS与speedtest.net服务器通信
--no-pre-allocate 不预分配上传数据(可能影响低内存系统性能)
其他:
--version 显示版本号并退出
10 百度网盘上传
# 安装
pip install bypy
# 连接
bypy info
# 上传
bypy upload --processes 10 ./test/SRR03.txt test1/
# 下载:将/我的应用数据/bypy目录下的文件全部下载到当前文件夹下
bypy downdir --downloader aria2 ./
# 比较
bypy compare
# 往云盘端创建文件夹
bypy mkdir xxx
# -v 显示进度详情;-d 显示调试信息;-ddd 显示HTTP通讯信息
11 比对工具
让我详细对比这些工具的应用场景:
- minimap2:
# 适用场景:
# - 长读长测序数据(PacBio/Nanopore)
# - 转录组比对(支持剪切)
# - 基因组组装比对
rule minimap2_align:
input:
query="long_reads.fastq",
target="reference.fa"
params:
# 长读长模式
extra="-ax map-ont" # 用于Nanopore数据
# 或 "-ax map-pb" # 用于PacBio数据
- BWA:
# 适用场景:
# - Illumina短读长数据
# - 重测序项目
# - 变异检测分析
rule bwa_align:
input:
reads=["reads_1.fq", "reads_2.fq"],
reference="reference.fa"
output:
"aligned.bam"
# BWA特别适合人类基因组等复杂基因组的比对
- Bowtie2:
# 适用场景:
# - 短读长DNA/RNA比对
# - ChIP-seq数据分析
# - 小基因组比对
rule bowtie2_align:
input:
reads=["reads_1.fq", "reads_2.fq"],
index="reference"
output:
"aligned.sam"
# 特别适合快速比对和内存受限的情况
- DIAMOND:
# 适用场景:
# - 蛋白质序列比对
# - 宏基因组分析
# - 功能注释
rule diamond_align:
input:
query="protein.fasta",
db="nr.dmnd"
output:
"alignments.tsv"
# 适合大规模蛋白质序列比对
具体应用场景对比:
- DNA测序数据分析:
短读长数据(<300bp):
- BWA-MEM:人类基因组等大型基因组
- Bowtie2:较小基因组,需要高速处理
- minimap2:通用场景,但不是最优选择
长读长数据(>1000bp):
- minimap2:最佳选择
- BWA/Bowtie2:不适用
- RNA测序数据分析:
短读长RNA-seq:
- Bowtie2:基础比对
- minimap2:支持剪切位点识别
- BWA:不推荐
长读长RNA-seq:
- minimap2:最佳选择
- 蛋白质序列分析:
蛋白质序列比对:
- DIAMOND:最佳选择,速度快
- 其他工具:不适用
宏基因组分析:
- DIAMOND:蛋白质水平注释
- minimap2:核酸水平比对
- 性能特点对比:
速度比较:
- DIAMOND:蛋白质比对最快
- minimap2:长读长数据处理最快
- BWA/Bowtie2:短读长数据各有优势
内存使用:
- Bowtie2:内存效率最高
- BWA:中等内存占用
- minimap2:可变,依赖数据
- DIAMOND:需要较大内存
准确性:
- BWA:短读长最准确
- minimap2:长读长最准确
- DIAMOND:蛋白质比对最准确
选择建议:
-
根据数据类型选择:
- 短读长DNA → BWA或Bowtie2
- 长读长DNA → minimap2
- RNA-seq → minimap2或Bowtie2
- 蛋白质序列 → DIAMOND
-
根据计算资源选择:
- 内存受限 → Bowtie2
- 速度优先 → 对应场景最快工具
- 准确性优先 → 对应场景最准工具
-
根据分析目的选择:
- 变异检测 → BWA/minimap2
- 转录组分析 → minimap2/Bowtie2
- 功能注释 → DIAMOND
- 宏基因组分析 → DIAMOND/minimap2
这些工具各有特点和适用场景,选择合适的工具对于提高分析效率和准确性至关重要。建议根据具体项目的数据类型、分析目的和计算资源来选择最适合的工具。
12 conda环境
查看每个环境中安装的包
for env in $(conda env list | grep -v '#' | awk '{print $1}'); do
echo "Checking environment: $env"
conda list -n $env | grep samtools
done
13 samtools
参考基因组比对
单末端
bowtie2 -p 10 -x genome_index -U input.fq | samtools sort -O bam -@ 10 -o - > output.bam
双末端
bowtie2 -p 10 -x genome_index -1 input_1.fq -2 input_2.fq | samtools sort -O bam -@ 10 -o - > output.bam
SAM转换为BAM
samtools view -bS example.sam > example.bam
BAM文件排序
samtools sort example.bam -o example.sorted.bam
14 空间占用
# 写入随机数据
dd if=/dev/urandom of=testfile bs=1M count=1024 # 创建1GB文件
# 写入零数据
dd if=/dev/zero of=testfile bs=1M count=1024 # 更快
fallocate -l 700G testfile
15 snakemake DAG图
Snakemake 生成 DAG (Directed Acyclic Graph) 图的主要命令有:
- 生成规则依赖图(简化版):
snakemake --rulegraph | dot -Tpdf > rulegraph.pdf
snakemake --rulegraph | dot -Tpng > rulegraph.png
snakemake --rulegraph | dot -Tsvg > rulegraph.svg
- 生成完整的任务依赖图(包含具体文件):
snakemake --dag | dot -Tpdf > dag.pdf
snakemake --dag | dot -Tpng > dag.png
snakemake --dag | dot -Tsvg > dag.svg
- 生成文件依赖图:
snakemake --filegraph | dot -Tpdf > filegraph.pdf
- 为特定目标生成依赖图:
# 为特定规则生成图
snakemake --dag target_rule | dot -Tpdf > target_dag.pdf
# 为特定文件生成图
snakemake --dag path/to/file | dot -Tpdf > file_dag.pdf
- 使用不同的输出格式:
# PDF格式
snakemake --dag | dot -Tpdf > dag.pdf
# PNG格式
snakemake --dag | dot -Tpng > dag.png
# SVG格式(可缩放矢量图)
snakemake --dag | dot -Tsvg > dag.svg
# DOT格式(原始图形描述语言)
snakemake --dag > dag.dot
- 添加额外选项:
# 包含所有标签
snakemake --dag --forceall | dot -Tpdf > full_dag.pdf
# 显示规则参数
snakemake --dag --printshellcmds | dot -Tpdf > dag_with_commands.pdf
# 包含资源信息
snakemake --dag --resources | dot -Tpdf > dag_with_resources.pdf
- 使用不同的布局引擎:
# 使用dot(默认)
snakemake --dag | dot -Tpdf > dag_dot.pdf
# 使用neato
snakemake --dag | neato -Tpdf > dag_neato.pdf
# 使用fdp
snakemake --dag | fdp -Tpdf > dag_fdp.pdf
# 使用circo(环形布局)
snakemake --dag | circo -Tpdf > dag_circo.pdf
- 自定义图形样式:
# 使用自定义配置文件
snakemake --dag | dot -Tpdf -Grankdir=LR > dag_horizontal.pdf # 水平布局
snakemake --dag | dot -Tpdf -Grankdir=TB > dag_vertical.pdf # 垂直布局
注意事项:
- 需要安装 Graphviz:
# Ubuntu/Debian
sudo apt-get install graphviz
# CentOS/RHEL
sudo yum install graphviz
# macOS
brew install graphviz
- 对于大型工作流,可以使用过滤选项:
# 只显示特定通配符的规则
snakemake --dag "sample1_{wildcard}" | dot -Tpdf > filtered_dag.pdf
# 限制显示深度
snakemake --dag --max-jobs-per-second 1 | dot -Tpdf > simplified_dag.pdf
- 调试技巧:
# 保存原始DOT文件以便调试
snakemake --dag > debug.dot
# 查看规则执行顺序
snakemake --dag --dryrun | dot -Tpdf > execution_plan.pdf
- 在conda环境中使用:
# 激活conda环境
conda activate your_env
# 生成图
snakemake --dag --use-conda | dot -Tpdf > conda_dag.pdf
这些命令可以帮助你:
- 理解工作流的结构
- 调试依赖关系
- 优化工作流设计
- 生成文档
- 分析任务执行顺序
16 本地部署大模型
1. ollama
ollama list
ollama run <model_name>
ollama rm <model_name>
ollama create <model_name> -f <modelfile>
modelfile:
FROM <path to guff>
2. lm studio
17 查看文件个数
# 显示所有文件夹的特定文件数
find /work/share/acc2spg9qp/LMY/meta_run/sra -maxdepth 1 -type d ! -name "sra" | while read dir; do
if [ "$dir" != "/work/share/acc2spg9qp/LMY/meta_run/sra" ]; then
echo -n "$(basename $dir): "
ls -1 "$dir"/*.fastq.gz 2>/dev/null | wc -l
fi
done
# 显示所有文件夹的所有文件数
find /work/share/acc2spg9qp/LMY/meta_run/sra -maxdepth 1 -type d ! -name "sra" | while read dir; do
if [ "$dir" != "/work/share/acc2spg9qp/LMY/meta_run/sra" ]; then
echo -n "$(basename $dir): "
ls -1 "$dir" 2>/dev/null | wc -l
fi
done
# 显示所有文件夹的非0文件数
find /work/share/acc2spg9qp/LMY/meta_run/sra -maxdepth 1 -type d ! -name "sra" | while read dir; do
if [ "$dir" != "/work/share/acc2spg9qp/LMY/meta_run/sra" ]; then
count=$(ls -1 "$dir" 2>/dev/null | wc -l)
if [ $count -gt 0 ]; then
echo "$(basename $dir): $count"
fi
fi
done
18 查看前台任务
ps aux | grep <repx>
pkill <name contain> # 模式匹配
killall <name> # 完整名称
# -9 可以强制关闭
# kill -9 <name> 也可以使用的
19 清晰显示
以下是一些实用的 PS1 配置方案:
- 经典三色分离(conda青色 + 用户主机粉色 + 路径黄色):
PS1='[\e[36m]($CONDA_DEFAULT_ENV) [\e[35m][\u@\h \W]$[\e[0m] '
PS1='\[\e[36m\]($CONDA_DEFAULT_ENV) \[\e[95m\][\u@\h] \[\e[93m\]\W\$\[\e[0m\] '
- 高对比度(conda绿色 + 主体蓝色):
PS1='\[\e[32m\]($CONDA_DEFAULT_ENV) \[\e[94m\][\u@\h \W]\$\[\e[0m\] '
- 简洁双色(conda青色 + 主体白色):
PS1='\[\e[36m\]($CONDA_DEFAULT_ENV) \[\e[97m\][\u@\h \W]\$\[\e[0m\] '
- 带完整路径版本(conda青色 + 用户主机紫色 + 完整路径黄色):
PS1='\[\e[36m\]($CONDA_DEFAULT_ENV) \[\e[35m\][\u@\h] \[\e[33m\]\w\$\[\e[0m\] '
- 多行显示清晰版(第一行信息,第二行提示符):
PS1='\[\e[36m\]($CONDA_DEFAULT_ENV)\[\e[0m\] \[\e[95m\][\u@\h]\[\e[0m\] \[\e[93m\]\w\[\e[0m\]\n\[\e[92m\]>\[\e[0m\] '
颜色代码参考:
# 常规颜色
\e[31m # 红色
\e[32m # 绿色
\e[33m # 黄色
\e[34m # 蓝色
\e[35m # 紫色
\e[36m # 青色
\e[37m # 白色
# 亮色版本
\e[91m # 亮红
\e[92m # 亮绿
\e[93m # 亮黄
\e[94m # 亮蓝
\e[95m # 亮紫
\e[96m # 亮青
\e[97m # 亮白
提示:
\W显示当前目录名\w显示完整路径\n换行- 如果想永久保存喜欢的配置,将选择的 PS1 设置添加到
~/.bashrc文件中
如果你想要在命令之间添加分隔线,可以在 ~/.bashrc 中添加:
function pre_command() {
echo -e "\033[36m----------------------------------------\033[0m"
}
trap pre_command DEBUG
这样每条命令执行前都会显示一条分隔线,使输出更清晰。
20 nohup
nohup snakemake [options] > snake_$(date +%Y%m%d_%H%M%S).log 2>&1 &
# >/dev/null 指的是将输出放在空设备文件也就是不输出
# 2>&1
# 2 表示标准错误(stderr)
# >& 是重定向操作符
# 1 表示标准输出(stdout)
# 合起来的意思是:将标准错误也重定向到和标准输出相同的位置
初次提交:
nohup snakemake -s Snakefile2 --executor slurm --use-conda --default-resources slurm_account=acc2spg9qp slurm_partition=xahcnormal -j 60 --resources download_slots=2 upload_slots=5 > nohup_batch3.out 2>&1 &
下一次:
nohup snakemake -s Snakefile2 --executor slurm --use-conda --default-resources slurm_account=acc2spg9qp slurm_partition=xahcnormal -j 60 --resources download_slots=2 upload_slots=5 >> nohup_batch3.out 2>&1 &
21 snakemake判断规则
--rerun-triggers {code,input,mtime,params,software-env} [{code,input,mtime,params,software-env} ...]
Define what triggers the rerunning of a job. By default, all triggers are used, which guarantees that results are
consistent with the workflow code and configuration. If you rather prefer the traditional way of just considering file
modification dates, use '--rerun-trigger mtime'. (default: code input mtime params software-env)
好的,让我总结一下Snakemake的重运行触发机制:
1. 基本原则(不受--rerun-triggers影响)
必定重新运行的情况:
- 输入文件不存在
- 输出文件不存在
- 输入文件发生变化(包括内容或时间戳)
- 上游任务的输出(作为下游任务的输入)发生变化
2. --rerun-triggers可控制的触发条件
snakemake --rerun-triggers [OPTIONS]
可选的触发器:
mtime: 仅检查文件修改时间params: 规则参数变化code: 规则代码变化input: 输入文件内容变化(通过checksum)software-env: 软件环境变化
3. 实际应用原则
避免不必要重运行的策略:
- 修改输入/输出结构时:
# 添加新输出时
rule test_coverage:
output:
old = "test_out/{sample}/result.txt",
new = "test_out/{sample}/metrics.txt" # 新增输出
- 手动创建新增的输出文件
- 设置合适的时间戳(与其他输出文件一致)
- 修改参数或代码时:
# 使用适当的触发器
snakemake -n --rerun-triggers none # 或其他需要的组合
- 文件时间戳管理:
# 同步文件时间戳
touch -r reference_file target_file
4. 实例说明
# Snakefile示例
rule example:
input:
"input/{sample}.txt"
output:
"output/{sample}.txt"
params:
threshold = 30 # 参数变化可通过--rerun-triggers params控制
shell:
"process {input} > {output}" # 代码变化可通过--rerun-triggers code控制
不同场景的行为:
# 场景1:输入文件变化 - 必定重运行
echo "new data" > input/sample1.txt
snakemake -n --rerun-triggers none # 仍会重运行
# 场景2:仅参数变化 - 可控制
# 修改params后
snakemake -n --rerun-triggers none # 不会重运行
snakemake -n --rerun-triggers params # 会重运行
# 场景3:新增输出文件 - 可通过文件操作避免
touch new_output.txt
touch -r old_output.txt new_output.txt
5. 最佳实践
-
开发阶段:
- 使用完整触发器集进行测试
snakemake -n # 使用所有默认触发器 -
生产环境:
- 根据需要选择触发器
- 谨慎处理输入文件变化
snakemake -n --rerun-triggers params code # 仅关注参数和代码变化 -
维护阶段:
- 记录文件依赖关系
- 合理管理文件时间戳
- 适当使用触发器控制重运行行为
22 logo
23 kingfisher
ERR10188151
conda install rpetit3::aspera-connect
kingfisher get -r ERR10188151 -m ena-ftp aws-http -f fastq.gz -t 1 --output-directory ./
kingfisher get -r ERR10188151 -m ena-ascp -f fastq.gz -t 1 --output-directory ./ --ascp-args "-k 1"
24 ssh密钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-keygen -t ecdsa -b 521 -C "your_email@example.com"
25 OpenMP和slurm冲突
报错信息: libgomp: Thread creation failed: Invalid argument
具体原因: SLURM的CPU绑定(cpu-bind)与OpenMP的线程亲和性设置发生冲突
- SLURM已经限定了程序只能使用特定的CPU核心
- OpenMP又尝试将线程分配到其他核心
解决方案:让其中一个"让步"
# 方案1:让SLURM不插手具体分配
export SLURM_CPU_BIND=none
# 方案2:让OpenMP不做具体分配
export OMP_PROC_BIND=false
实践可用配置:
# 明确设置需要的环境变量
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK # 确保OpenMP不会创建超过SLURM分配的线程数
export OMP_PROC_BIND=false # 控制线程绑定策略,false:线程可以在核心间迁移
export OMP_PLACES=cores # 指定线程放置位置,cores:使用物理核心, threads:使用硬件线程(包括超线程),sockets:使用处理器插槽
26 同步策略
rsync -avz --progress -e "ssh -p 65082" . acgecuxr3d@eshell111.hpccube.com:/work/share/acc2spg9qp/LMY/meta_new/sra/.
27 pixi使用
安装
Linux & macOS
curl -fsSL https://pixi.sh/install.sh | sh
//
wget -qO- https://pixi.sh/install.sh | sh
win
https://github.com/prefix-dev/pixi/releases/latest/download/pixi-x86_64-pc-windows-msvc.msi
powershell -ExecutionPolicy ByPass -c "irm -useb https://pixi.sh/install.ps1 | iex"
各种操作
// 初始化
pixi init
// 查看项目信息
pixi info
// 添加channel
pixi project channel add <所需channel>
// 创建环境
pixi project environment add <环境名>
// 添加依赖项
pixi add <python=3.7 wget ...> -f <目的环境>
// 查看所有环境
pixi project environment list
// 查看特定环境的包
pixi list --environment <环境名>
// 移除依赖项
pixi remove <依赖> -f <目的环境>
// 更新特定环境
pixi update -f <环境名>
// 删除环境
pixi project environment remove <环境名>
基础操作流程
## 初始化
pixi init
## 配置channels
pixi project channel add <所需channel>
pixi project channel list # 查看已添加的channels
## 环境与依赖
# 环境
pixi project environment add <环境名>
# 依赖
pixi add <python=3.7 wget ...> -f <目的环境> # 环境特定依赖
pixi add <package> --pypi # 添加PyPI包
pixi add <package> --platform linux-64 # 平台特定依赖
pixi add <...> # 默认依赖
## 安装和更新
pixi install # 安装所有依赖
pixi install --frozen # 按锁文件安装(生产环境)
pixi install --locked # 检查锁文件一致性
pixi update # 更新所有包
pixi update -f <环境名> # 更新特定环境
pixi update <package_name> # 更新特定包
## 查看与管理
# 项目信息
pixi info # 项目概览
pixi project channel list # 查看channels
pixi project environment list # 查看环境列表
# 包信息
pixi list # 默认环境包列表
pixi list --feature <功能名> # 特定功能包列表
pixi list --environment <环境名> # 特定环境包列表(如果支持)
pixi search <package_name> # 搜索包
# 删除操作
pixi remove <package_name> # 从默认环境删除
pixi remove <package_name> -f <功能名> # 从特定功能删除
pixi project environment remove <环境名> # 删除环境
## 运行和使用
# 进入环境
pixi shell // 进入默认环境
pixi shell --feature <功能名> // 进入特定功能环境
pixi shell -e <环境名> // 进入特定环境(如果支持)
# 运行命令
pixi run <command> // 在默认环境运行
pixi run --feature <功能名> "<command>" // 在特定功能环境运行
pixi run -e <环境名> "<command>" // 在特定环境运行(如果支持)
# 执行脚本
pixi run python script.py
pixi run -f analysis "humann --input data.txt"
## 任务管理
# 在pixi.toml中添加:
[tasks]
test = "pytest tests/"
run = "python main.py"
clean = "rm -rf output/*"
dev = { cmd = "jupyter lab", env = "dev" }
# 然后使用:
pixi run test
pixi run clean
pixi run dev
## 故障排除
pixi clean cache // 清理缓存
pixi install --revalidate // 重新验证环境
pixi install --no-lockfile-update // 不更新锁文件
pixi install -v // 详细输出
pixi list --tree // 显示依赖树(如果支持)
## 项目分享
# 分享项目(包含pixi.lock)
git add pixi.toml pixi.lock
git commit -m "Add pixi configuration"
# 其他人使用:
git clone <repo>
cd <repo>
pixi install // 完全复现环境
## 高级操作
# 导出环境
pixi list --json > environment.json // 导出包列表
# 平台管理
pixi add <package> --platform linux-64 --platform osx-arm64
# 构建和主机依赖
pixi add <package> --build // 构建时依赖
pixi add <package> --host // 运行时依赖
## 完整的生物信息学项目设置
mkdir microbiome-analysis && cd microbiome-analysis
pixi init
pixi project channel add bioconda biobakery
pixi add snakemake python=3.9 # 基础环境
pixi add python=3.7 humann bowtie2 -f analysis # 分析环境
pixi add fastqc multiqc trim-galore -f qc # 质控环境
pixi install
pixi run -f qc "fastqc --version"
pixi run -f analysis "humann --version"
28 less 常用操作指南
1. 基本导航
# 向下滚动
Space / f # 向下翻页
Enter / j / ↓ # 向下一行
d # 向下半页
# 向上滚动
b # 向上翻页
k / ↑ # 向上一行
u # 向上半页
# 跳转
g / Home # 跳到文件开头
G / End # 跳到文件末尾
数字g # 跳到指定行(如 100g 跳到第100行)
数字% # 跳到文件指定百分比位置(如 50% 跳到中间)
2. 搜索功能
# 向下搜索
/pattern # 搜索 pattern
n # 查找下一个匹配
N # 查找上一个匹配
# 向上搜索
?pattern # 向上搜索 pattern
# 搜索示例
/error # 搜索 "error"
/^Error # 搜索以 "Error" 开头的行
/\d+ # 搜索数字(需要正则表达式支持)
3. 标记和跳转
# 设置标记
m + 字母 # 设置标记(如 ma 设置标记a)
# 跳转到标记
' + 字母 # 跳转到标记(如 'a 跳转到标记a)
'' # 跳转到上一个位置
4. 显示控制
# 行号显示
-N # 启动时显示行号
= / Ctrl+G # 显示当前位置信息
# 换行控制
-S # 不换行显示长行
-chop-long-lines # 截断长行
# 高亮
-i # 搜索时忽略大小写
-I # 智能大小写搜索
5. 文件操作
# 文件切换(多文件时)
:n # 下一个文件
:p # 上一个文件
:e filename # 打开新文件
# 重新加载
r / Ctrl+L # 重绘屏幕
R # 重新读取文件(适用于正在变化的文件)
6. 退出操作
q / Q # 退出
ZZ # 退出(类似vi)
:q # 退出
7. 实用技巧
查看日志文件
# 实时查看变化的日志
less +F logfile.txt # 类似 tail -f
F # 在less中切换到follow模式
Ctrl+C # 退出follow模式
# 查看大文件
less large_file.txt # 不会加载整个文件到内存
查看压缩文件
# 直接查看压缩文件(如果系统支持)
less file.gz
less file.bz2
zless file.gz # 专门用于压缩文件
管道使用
# 与其他命令结合
ps aux | less # 分页查看进程
cat large_file | less # 分页查看
grep "error" log.txt | less # 分页查看搜索结果
8. 常用启动选项
less -N file.txt # 显示行号
less -S file.txt # 不换行
less -i file.txt # 忽略大小写搜索
less -X file.txt # 退出后不清屏
less +/pattern file.txt # 打开后立即搜索pattern
less +G file.txt # 打开后跳到末尾
less +100 file.txt # 打开后跳到第100行
9. 配置环境变量
# 在 ~/.bashrc 或 ~/.profile 中设置
export LESS="-N -i -X" # 默认显示行号、忽略大小写、退出不清屏
export PAGER=less # 设置默认分页器
10. 实际使用示例
查看代码文件
less -N script.py # 带行号查看Python文件
/def # 搜索函数定义
n # 查看下一个函数
查看配置文件
less /etc/nginx/nginx.conf
/server # 搜索server块
查看命令帮助
man command | less # 查看手册页
command --help | less # 查看帮助信息
11. 快捷记忆
导航: Space(下翻页) b(上翻页) g(开头) G(结尾)
搜索: /搜索内容 n(下一个) N(上一个)
退出: q
行号: -N
实时: +F (或 F键切换)
12. 与其他工具比较
# less vs more
less file.txt # 可以向上翻页,功能更强
more file.txt # 只能向下翻页
# less vs cat
cat file.txt # 直接输出全部内容
less file.txt # 分页查看,适合大文件
# less vs vim
vim file.txt # 编辑器,可以修改
less file.txt # 只读查看器,更快
最常用的组合:less -N filename(带行号查看文件)
29 Windows常用命令(用到时记录)
1 读取文件夹名称以及比较文本差异
Get-ChildItem -Directory | ForEach-Object { $_.Name.Split('-')[0] } > id.txt
Compare-Object (Get-Content id.txt) (Get-Content id_2.txt) |
>> ForEach-Object { "$($_.InputObject)`t$($_.SideIndicator)" } > id_compare.txt
30 查看空间占用
df -h ~
du -sh *
31 配置代理
powershell:
$Env:http_proxy="http://127.0.0.1:10809"
$Env:https_proxy="http://127.0.0.1:10809"
cmd:
set http_proxy=http://127.0.0.1:10809
set https_proxy=http://127.0.0.1:10809
# 验证
curl -v https://www.google.com
取消代理:
set http_proxy=
set https_proxy=
32 docker compose安装问题
确认系统版本cat /etc/os-release
- 安装仓库配置需要的基础包:
apt-get update
apt-get install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
- 添加Docker官方GPG Key:
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
- 添加Docker官方仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
- 刷新索引
apt-get update
- 安装
apt-get install -y docker-compose-plugin
33 软链接
软链接是指向源文件路径的小文件。
建立软连接:
ln -s target new_name
ln -sfn target new_name
-s:创建软链接
-f:强制覆盖
-n:如果目标是链接目录,不跟随进入目录
ls -lh link # 查看链接指向
readlink -f link # 查看解析后的绝对(-f)路径
34 rustdesk接口替换
由于校园网限制了 RustDesk 默认端口 21115–21117,因此将 RustDesk 服务端口调整到校园网可访问的端口组合:8442、8443、8445、9443、9445。
-
测试服务器端口能否使用:开放对应窗口的防火墙
apt update apt install -y netcat-openbsd nc -l -p 8443Test-NetConnection 你的服务器IP -Port 8443 -
测试完成后打开对应的防火墙8443开启UDP和TCP,其余开启TCP。在云服务器安全组中放行对应端口;如果服务器本机启用了 ufw,也需要同步放行。(ufw status显示Status: inactive的时候不用管)
-
修改配置文件:
(找位置:
systemctl list-units --type=service | grep -i rust,从输出的服务里面选择systemctl cat rustdesksignal.service)cp /etc/systemd/system/rustdesksignal.service /etc/systemd/system/rustdesksignal.service.bak cp /etc/systemd/system/rustdeskrelay.service /etc/systemd/system/rustdeskrelay.service.bak vi /etc/systemd/system/rustdesksignal.service # 修改为ExecStart=/opt/rustdesk/hbbs -p 8443 -r 124.220.148.55:9443 vi /etc/systemd/system/rustdeskrelay.service # 修改为ExecStart=/opt/rustdesk/hbbr -p 9443 -
重启服务
systemctl daemon-reload systemctl restart rustdeskrelay.service systemctl restart rustdesksignal.service # 检查 systemctl status rustdeskrelay.service systemctl status rustdesksignal.service ss -lntup | grep -E '8442|8443|8445|9443|9445' -
rustdesk客户端填写
ID服务器:124.220.148.55:8443 中继服务器:124.220.148.55:9443 API服务器:不填 Key:原来的 keykey:
cat /opt/rustdesk/id_ed25519.pub
35 SSH端口转发
sftp \
-i hpc_key.pem \
-P 60022 \
-o ProxyJump="middle_user@middle.server.com:22" \
-o IdentityFile=middle_key.pem \
hpc_user@hpc.login.com
写入配置:
Host middle
HostName middle.server.com
User middle_user
Port 22
IdentityFile ~/.ssh/middle_key.pem
Host hpc
HostName hpc.login.com
User hpc_user
Port 60022
IdentityFile ~/.ssh/hpc_key.pem
ProxyJump middle
#或者
Host hpc
HostName hpc.login.com
User hpc_user
Port 60022
IdentityFile ~/.ssh/hpc_key.pem
ProxyJump middle_user@middle.server.com:22
注意密钥可能需要开放等级低一些:
chmod 600 key
36 模式匹配查找
grep -F -f file2.tsv file1.tsv > matched.tsv
-F 按普通字符串匹配,不做为正则表达式
-f 从指定的文件读取匹配模式
这里指的是从file2中读取匹配规则,应用于file1中
awk -F '\t' 'NR==FNR {ids[$1]=1; next} $1 in ids' file2.tsv file1.tsv > match.tsv
若file2.tsv的ID不在第一列,在第二列的话,可以把$1改为$2
37 srun创建伪终端
srun -p <分区名> -N 1 -n 1 -c 6 --mem=16G --time=04:00:00 --pty bash