如何在qsub命令中使用pipe道或redirect?

有一些命令我想使用需要使用pipe道( | )或redirect( > )的qsub(SGE 8.1.3,CentOS 5.9)在网格上运行。 例如,假设我必须并行化该命令

 echo 'hello world' > hello.txt 

(显然是一个简单的例子:实际上我可能需要将程序的输出直接redirect到samtools )。 如果我做到了:

 qsub echo 'hello world' > hello.txt 

结果hello.txt内容看起来像

 Your job 123454321 ("echo") has been submitted 

同样,如果我使用了一个pipe道( echo "hello world" | myprogram ),那么这个消息就会被传递给myprogram ,而不是实际的stdout。

我知道我可以编写一个小的bash脚本,每个脚本都包含带有pipe道/redirect的命令,然后执行qsub ./myscript.sh 。 不过,我正在尝试使用脚本同时运行多个并行作业,所以我必须编写许多这样的bash脚本,每个脚本的命令略有不同。 当这个解决scheme的脚本可以开始感到非常黑客。 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 不必创build另一个文件包含命令?

    你可以通过把它变成一个bash -c命令,让你把| 在引用的声明中:

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

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

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

    以及。

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

    1. 使用启用二进制模式运行qsub,因为默认的qsub行为相当期待编译的代码。 为此,您可以使用“-by”标志指向qsub,避免“二进制模式所需的排序”命令或“脚本长度与声明长度不匹配”的错误。
    2. 将每个调用回显给qsub,然后将其传递给shell。

    假设你有一个文件params-query.txt,它包含几个bowtie命令和管道调用以下形式的samtools:

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

    要将每个查询作为单独的作业发送,首先要通过xargs STDIN从STDIN准备命令行单元。 请注意,如果您要提交管道部件的命令,则括号内的引号非常重要。 这样你的整个查询被视为一个单位。

     cat params-query.txt | xargs -i echo qsub -by -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 

    这个网页有你可能喜欢的有趣的qsub技巧

     grep http *.job | awk -F: '{print $1}' | sort -u | xargs -I {} qsub {}