我想使用 qsub(SGE 8.1.3,CentOS 5.9)在网格上运行一些命令,这些命令需要使用管道(|
)或重定向(>
)。例如,假设我必须并行化命令
echo 'hello world' > hello.txt
(显然是一个简化的例子:实际上我可能需要将像 bowtie 这样的程序的输出直接重定向到samtools )。如果我这样做了:
qsub echo 'hello world' > hello.txt
的结果内容hello.txt
看起来像
Your job 123454321 ("echo") has been submitted
同样,如果我使用管道 ( echo "hello world" | myprogram
),则该消息将传递给myprogram
,而不是实际的标准输出。
我知道我可以编写一个小的 bash 脚本,每个脚本都包含带有管道/重定向的命令,然后执行qsub ./myscript.sh
. 但是,我正在尝试使用脚本同时运行许多并行化作业,因此我必须编写许多这样的 bash 脚本,每个脚本都使用稍微不同的命令。在编写此解决方案的脚本时,可能会开始感觉非常骇人听闻。Python中此类脚本的示例:
for i, (infile1, infile2, outfile) in enumerate(files):
command = ("bowtie -S %s %s | " +
"samtools view -bS - > %s\n") % (infile1, infile2, outfile)
script = "job" + str(counter) + ".sh"
open(script, "w").write(command)
os.system("chmod 755 %s" % script)
os.system("qsub -cwd ./%s" % script)
这令人沮丧有几个原因,其中我的程序甚至无法删除许多jobXX.sh
脚本以自行清理,因为我不知道作业将在队列中等待多长时间,并且脚本必须工作开始时到场。
有没有办法将我的完整echo 'hello world' > hello.txt
命令提供给 qsub ,而不必创建另一个包含该命令的文件?