bash - 如何为批处理作业中的每个进程创建单独的临时目录
问题描述
我刚刚开始在我的实验室学习生物信息学,我是一个完全的新手。我正在使用来自 NCBI 的名为 Kofamscan 的基因组注释工具,我收到一个错误,这可能是由于多个进程的结果存储在同一个临时目录中并且文件正在崩溃。所以我想为每个进程创建单独的临时目录(temp1 用于 process1,temp2 用于 process2,...等),但我不知道如何编写启用它的代码。
files=(`cat kofam_files`) #input files
TASK_ID = `expr ${SGE_TASK_ID} -1`
~/kofamscan/bin/exec_annotation -o marine_kofam.txt --tmp-dir **** ${files[$TASK_ID]}
我可能需要在****
上面的代码部分写一些东西,但我不知道如何写它们。
先感谢您。
良平
解决方案
这正是mktemp
命令存在的原因:)
以下代码段是您必须对您的代码进行的最小更改:
files=(`cat kofam_files`) #input files
TASK_ID=`expr ${SGE_TASK_ID} -1`
~/kofamscan/bin/exec_annotation -o marine_kofam.txt --tmp-dir `mktemp -d` ${files[$TASK_ID]}
请注意,临时目录将在其中创建/tmp
。您可以使用标志mktemp
在当前目录中创建临时子目录。
编辑:遵循最佳实践bash
,一个也可以,
- 使用较新的
mapfile
orreadarray
命令(在bash
4+ 中)而不是使用cat
在bash
- 使用
$(...)
而不是`...`
因为它们支持嵌套 - 使用
$((...))
而不是古老的expr
语法(请参阅此线程)
最后的代码片段看起来像:
readarray -t files < kofam_files #input files
TASK_ID=$((SGE_TASK_ID - 1))
~/kofamscan/bin/exec_annotation -o marine_kofam.txt --tmp-dir $(mktemp -d) ${files[$TASK_ID]}