如何在qsub命令中使用管道或重定向?

时间:2013-08-19 20:12:15

标签: linux pipe qsub grid-computing sungridengine

我想在网格上使用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脚本,每个脚本的命令略有不同。编写脚本时,此解决方案可能会开始变得非常hackish。 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脚本以便自行清理,因为我不知道这份工作要等多久队列,并且当作业开始时脚本必须在那里。

有没有办法向qsub 提供我的完整echo 'hello world' > hello.txt命令,而不必创建包含该命令的另一个文件?

3 个答案:

答案 0 :(得分:6)

您可以通过将其变为bash -c命令来执行此操作,该命令允许您将|放在引用的语句中:

 qsub bash -c "cmd <options> | cmd2 <options>"

正如@spuder在评论中指出的那样,似乎在其他版本的qsub(不是我正在使用的SGE 8.1.3)中,可以用以下方法解决问题:

echo "cmd <options> | cmd2 <options>" | qsub

答案 1 :(得分:2)

虽然我的回答有点晚,但我会为任何传入的观众添加它。要使用管道/直接并将其作为qsub作业提交,您需要做一些事情。但首先,在管道末端使用qsub就像你一样,只会导致一个作业被发送到队列(即你的代码将连续运行而不是并行化)。

  1. 使用启用二进制模式运行qsub,因为默认的qsub行为反而需要编译代码。为此,你使用&#34; -b y&#34;标记到qsub并且您将避免二进制模式所需的排序&#34;命令的任何错误&#34;或&#34;脚本长度与声明的长度不匹配&#34;。
  2. 回显对qsub的每次调用,然后将其传递给shell。
  3. 假设你有一个文件params-query.txt,它包含几个bowtie命令和对以下形式的samtools的管道调用:

    bowtie -q query -1 param1 -2 param2 ... | samtools ...
    

    要将每个查询作为单独的作业发送,首先从STDIN到xargs STDIN准备命令行单元。请注意,如果要提交管道部件命令,则括号周围的引号很重要。这样就可以将整个查询视为一个单元。

    cat params-query.txt | xargs -i echo qsub -b y -o output_log  -e error_log -N job_name \"{}\" | sh 
    

    如果没有按预期工作,那么在调用samtools接受中间输出之前,你可能最好在bowtie和samtools之间生成一个中间输出。您不需要通过xargs更改qsub调用,但params-query.txt中的代码应如下所示:

    bowtie -q query -o intermediate_query_out -1 param1 -2 param2 && samtools read_from_intermediate_query_out
    

    This page has interesting qsub tricks you might like

答案 2 :(得分:0)

string filename = dir + currentDate + fileName + ".png";
screenshot.SaveAsFile(filename, ImageFormat.png);