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本地

  1. 直接使用conda本地安装
conda install --use-local /path/to/linux-64/aria2-1.37.0-hbc8128a_2.conda
  1. 如果想添加到特定环境
# 激活目标环境
conda activate your_environment_name

# 安装
conda install --use-local /path/to/linux-64/aria2-1.37.0-hbc8128a_2.conda
  1. 如果遇到问题,可以尝试
# 先验证文件
conda install -n base conda-build
conda index /path/to/directory/containing/conda/file

# 然后安装
conda install --use-local aria2
  1. 备选方案:使用pip
pip install aria2c

推荐按顺序尝试这些方法。第一种方法通常最直接和有效。

3 bowtie2构建ref

  1. 多个参考库,建议:
kneaddata --input sample_R1.fastq.gz --input sample_R2.fastq.gz -db $DB1 -db $DB2
  1. 构建参考库,也可以逗号分隔fastq文件

  2. 可以使用 bowtie2-inspect 将 bt2 索引转换为 fasta 序列,然后使用它来构建组合索引

4 SSH反向隧道(Remote Forwarding)

  1. 首先在内网服务器建立到外网的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

永久生效的方法:

  1. 对于 Bash shell(~/.bashrc):
echo 'export PATH=~/miniconda3/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
  1. 对于 Zsh shell(~/.zshrc):
echo 'export PATH=~/miniconda3/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
  1. 对于 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压缩

建议

  1. 不确定压缩包类型时,可以使用 file filename 命令查看
  2. 使用 -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 比对工具

让我详细对比这些工具的应用场景:

  1. minimap2:
# 适用场景:
# - 长读长测序数据(PacBio/Nanopore)
# - 转录组比对(支持剪切)
# - 基因组组装比对
rule minimap2_align:
    input:
        query="long_reads.fastq",
        target="reference.fa"
    params:
        # 长读长模式
        extra="-ax map-ont"  # 用于Nanopore数据
        # 或 "-ax map-pb"    # 用于PacBio数据
  1. BWA:
# 适用场景:
# - Illumina短读长数据
# - 重测序项目
# - 变异检测分析
rule bwa_align:
    input:
        reads=["reads_1.fq", "reads_2.fq"],
        reference="reference.fa"
    output:
        "aligned.bam"
    # BWA特别适合人类基因组等复杂基因组的比对
  1. Bowtie2:
# 适用场景:
# - 短读长DNA/RNA比对
# - ChIP-seq数据分析
# - 小基因组比对
rule bowtie2_align:
    input:
        reads=["reads_1.fq", "reads_2.fq"],
        index="reference"
    output:
        "aligned.sam"
    # 特别适合快速比对和内存受限的情况
  1. DIAMOND:
# 适用场景:
# - 蛋白质序列比对
# - 宏基因组分析
# - 功能注释
rule diamond_align:
    input:
        query="protein.fasta",
        db="nr.dmnd"
    output:
        "alignments.tsv"
    # 适合大规模蛋白质序列比对

具体应用场景对比:

  1. DNA测序数据分析:
短读长数据(<300bp):
- BWA-MEM:人类基因组等大型基因组
- Bowtie2:较小基因组,需要高速处理
- minimap2:通用场景,但不是最优选择

长读长数据(>1000bp):
- minimap2:最佳选择
- BWA/Bowtie2:不适用
  1. RNA测序数据分析:
短读长RNA-seq:
- Bowtie2:基础比对
- minimap2:支持剪切位点识别
- BWA:不推荐

长读长RNA-seq:
- minimap2:最佳选择
  1. 蛋白质序列分析:
蛋白质序列比对:
- DIAMOND:最佳选择,速度快
- 其他工具:不适用

宏基因组分析:
- DIAMOND:蛋白质水平注释
- minimap2:核酸水平比对
  1. 性能特点对比:
速度比较:
- DIAMOND:蛋白质比对最快
- minimap2:长读长数据处理最快
- BWA/Bowtie2:短读长数据各有优势

内存使用:
- Bowtie2:内存效率最高
- BWA:中等内存占用
- minimap2:可变,依赖数据
- DIAMOND:需要较大内存

准确性:
- BWA:短读长最准确
- minimap2:长读长最准确
- DIAMOND:蛋白质比对最准确

选择建议:

  1. 根据数据类型选择:

    • 短读长DNA → BWA或Bowtie2
    • 长读长DNA → minimap2
    • RNA-seq → minimap2或Bowtie2
    • 蛋白质序列 → DIAMOND
  2. 根据计算资源选择:

    • 内存受限 → Bowtie2
    • 速度优先 → 对应场景最快工具
    • 准确性优先 → 对应场景最准工具
  3. 根据分析目的选择:

    • 变异检测 → 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) 图的主要命令有:

  1. 生成规则依赖图(简化版):
snakemake --rulegraph | dot -Tpdf > rulegraph.pdf
snakemake --rulegraph | dot -Tpng > rulegraph.png
snakemake --rulegraph | dot -Tsvg > rulegraph.svg
  1. 生成完整的任务依赖图(包含具体文件):
snakemake --dag | dot -Tpdf > dag.pdf
snakemake --dag | dot -Tpng > dag.png
snakemake --dag | dot -Tsvg > dag.svg
  1. 生成文件依赖图:
snakemake --filegraph | dot -Tpdf > filegraph.pdf
  1. 为特定目标生成依赖图:
# 为特定规则生成图
snakemake --dag target_rule | dot -Tpdf > target_dag.pdf

# 为特定文件生成图
snakemake --dag path/to/file | dot -Tpdf > file_dag.pdf
  1. 使用不同的输出格式:
# 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
  1. 添加额外选项:
# 包含所有标签
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
  1. 使用不同的布局引擎:
# 使用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
  1. 自定义图形样式:
# 使用自定义配置文件
snakemake --dag | dot -Tpdf -Grankdir=LR > dag_horizontal.pdf  # 水平布局
snakemake --dag | dot -Tpdf -Grankdir=TB > dag_vertical.pdf    # 垂直布局

注意事项:

  1. 需要安装 Graphviz:
# Ubuntu/Debian
sudo apt-get install graphviz

# CentOS/RHEL
sudo yum install graphviz

# macOS
brew install graphviz
  1. 对于大型工作流,可以使用过滤选项:
# 只显示特定通配符的规则
snakemake --dag "sample1_{wildcard}" | dot -Tpdf > filtered_dag.pdf

# 限制显示深度
snakemake --dag --max-jobs-per-second 1 | dot -Tpdf > simplified_dag.pdf
  1. 调试技巧:
# 保存原始DOT文件以便调试
snakemake --dag > debug.dot

# 查看规则执行顺序
snakemake --dag --dryrun | dot -Tpdf > execution_plan.pdf
  1. 在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 配置方案:

  1. 经典三色分离(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\] '
  1. 高对比度(conda绿色 + 主体蓝色):
PS1='\[\e[32m\]($CONDA_DEFAULT_ENV) \[\e[94m\][\u@\h \W]\$\[\e[0m\] '
  1. 简洁双色(conda青色 + 主体白色):
PS1='\[\e[36m\]($CONDA_DEFAULT_ENV) \[\e[97m\][\u@\h \W]\$\[\e[0m\] '
  1. 带完整路径版本(conda青色 + 用户主机紫色 + 完整路径黄色):
PS1='\[\e[36m\]($CONDA_DEFAULT_ENV) \[\e[35m\][\u@\h] \[\e[33m\]\w\$\[\e[0m\] '
  1. 多行显示清晰版(第一行信息,第二行提示符):
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. 实际应用原则

避免不必要重运行的策略

  1. 修改输入/输出结构时
# 添加新输出时
rule test_coverage:
    output:
        old = "test_out/{sample}/result.txt",
        new = "test_out/{sample}/metrics.txt"  # 新增输出
  • 手动创建新增的输出文件
  • 设置合适的时间戳(与其他输出文件一致)
  1. 修改参数或代码时
# 使用适当的触发器
snakemake -n --rerun-triggers none  # 或其他需要的组合
  1. 文件时间戳管理
# 同步文件时间戳
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. 最佳实践

  1. 开发阶段

    • 使用完整触发器集进行测试
    snakemake -n  # 使用所有默认触发器
    
  2. 生产环境

    • 根据需要选择触发器
    • 谨慎处理输入文件变化
    snakemake -n --rerun-triggers params code  # 仅关注参数和代码变化
    
  3. 维护阶段

    • 记录文件依赖关系
    • 合理管理文件时间戳
    • 适当使用触发器控制重运行行为

22 logo

Linux

Python

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

  1. 安装仓库配置需要的基础包:
apt-get update
apt-get install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
  1. 添加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
  1. 添加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
  1. 刷新索引
apt-get update
  1. 安装
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。

  1. 测试服务器端口能否使用:开放对应窗口的防火墙

    apt update
    apt install -y netcat-openbsd
    nc -l -p 8443
    
    Test-NetConnection 你的服务器IP -Port 8443
    
  2. 测试完成后打开对应的防火墙8443开启UDP和TCP,其余开启TCP。在云服务器安全组中放行对应端口;如果服务器本机启用了 ufw,也需要同步放行。(ufw status显示Status: inactive的时候不用管)

  3. 修改配置文件:

    (找位置: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
    
  4. 重启服务

    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'
    
  5. rustdesk客户端填写

    ID服务器:124.220.148.55:8443
    中继服务器:124.220.148.55:9443
    API服务器:不填
    Key:原来的 key
    

    key: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