像 Nextflow 这样的工作流管理系统的一个关键特性是可重入性,即在上次成功执行的流程出现错误后重新启动管道的能力。可重入性允许在向管道添加更多数据时跳过耗时的已经完成的步骤,例如创建索引。这会促进更快的工作流原型的开发,以及更快的附加数据分析。Nextflow 通过缓存和检查点自动跟踪管道中执行的所有进程来实现重入。
Resume
为了从最后一个成功执行的进程重新启动,可以在命令行中添加-resume
选项。例如:
$ nextflow run wc.nf --input 'data/yeast/reads/ref1*.fq.gz' -resume
如何恢复工作
这个机制依赖于为每个任务分配的唯一的ID。这个ID用来创建一个单独的执行目录在work
目录下,在这个目录中执行任务并存储结果。
当恢复一个workflow时会使用这个ID检查:
- 工作目录是否存在
- 命令行的退出状态是否正确
- 是否包含期望的输出文件
如果以上全部满足,那么这部分任务会跳过并且使用之前的计算结果。当任务需要重新计算时,如上述条件不能满足时,下游的任务会自动失效。
因此,如果修改了脚本的某些部分,或者修改了输入数据,使用-resume
执行时将只执行实际修改的进程。
未被修改的进程将不会执行,使用缓存的结果。
work目录
默认情况下,管道结果缓存在work
目录,也是管道执行的地方。
可以使用tree
命令来查看work目录的内容。默认tree不会显示隐藏文件,可以使用-a
查看所有的文件。
$ tree -a work
输出:
work/
├── 12
│ └── 5489f3c7dbd521c0e43f43b4c1f352
│ ├── .command.begin
│ ├── .command.err
│ ├── .command.log
│ ├── .command.out
│ ├── .command.run
│ ├── .command.sh
│ ├── .exitcode
│ └── temp33_1_2.fq.gz -> /home/training/data/yeast/reads/temp33_1_2.fq.gz
├── 3b
│ └── a3fb24ad3242e4cc8e5aa0c24d174b
│ ├── .command.begin
│ ├── .command.err
│ ├── .command.log
│ ├── .command.out
│ ├── .command.run
│ ├── .command.sh
│ ├── .exitcode
│ └── temp33_2_1.fq.gz -> /home/training/data/yeast/reads/temp33_2_1.fq.gz
├── 4c
│ └── 125b5e5a5ee144fa25dd9bccd467e9
│ ├── .command.begin
│ ├── .command.err
│ ├── .command.log
│ ├── .command.out
│ ├── .command.run
│ ├── .command.sh
│ ├── .exitcode
│ └── temp33_3_1.fq.gz -> /home/training/data/yeast/reads/temp33_3_1.fq.gz
├── 54
│ └── eb9d72e9ac24af8183de569ab0b977
│ ├── .command.begin
│ ├── .command.err
│ ├── .command.log
│ ├── .command.out
│ ├── .command.run
│ ├── .command.sh
│ ├── .exitcode
│ └── temp33_2_2.fq.gz -> /home/training/data/yeast/reads/temp33_2_2.fq.gz
├── e9
│ └── 31f28c291481342cc45d4e176a200a
│ ├── .command.begin
│ ├── .command.err
│ ├── .command.log
│ ├── .command.out
│ ├── .command.run
│ ├── .command.sh
│ ├── .exitcode
│ └── temp33_1_1.fq.gz -> /home/training/data/yeast/reads/temp33_1_1.fq.gz
└── fa
└── cd3e49b63eadd6248aa357083763c1
├── .command.begin
├── .command.err
├── .command.log
├── .command.out
├── .command.run
├── .command.sh
├── .exitcode
└── temp33_3_2.fq.gz -> /home/training/data/yeast/reads/temp33_3_2.fq.gz
任务执行目录
在work
目录中有多个任务执行目录。每次执行进程都有一个目录。这些任务目录使用task ID表示。
任务执行目录包含:
.command.sh
:命令行执行脚本。.command.run
:用于执行任务的包装的命令。.command.out
:任务完成的输出。.command.err
:任务的错误输出。.command.log
:封装的执行输出。.command.begin
:任务启动后立即创建的文件。.exitcode
:任务的退出码。- 任务的输入文件(符号链接)。
- 任务的输出文件。
指定另外的工作目录
work目录会占用很大的磁盘空间。可以指定其他的目录使用-w
选项。
$ nextflow run wc.nf --input 'data/yeast/reads/temp33*' -w second_work_dir -resume
清理工作目录
如果确定不用恢复管道执行,可以使用nextflow clean
来定期清理该目录。
$ nextflow clean [run_name|session_id] [options]
可以使用-n
选项查看要删除的文件而不会删除它们,或使用-f
强制删除这些文件。如果只想删除文件,但保留执行日志和元数据,可以使用-k
选项。多次运行可以被清理使用-before
, -after
, -but
选项。例如:下面的命令会删除在gigantic_minsky
之前运行的所有的临时文件和日志条目。
$ nextflow clean -f -before gigantic_minsky