6

我想使用 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 ,而不必创建另一个包含该命令的文件?

4

3 回答 3

7

你可以通过把它变成一个bash -c命令来做到这一点,它可以让你把它|放在一个带引号的语句中:

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

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

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

也是。

于 2013-09-09T16:26:13.207 回答
3

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

  1. 使用启用二进制模式运行 qsub,因为默认的 qsub 行为需要编译的代码。为此,您对 qsub 使用“-b y”标志,您将避免“二进制模式所需的命令”或“脚本长度与声明的长度不匹配”之类的任何错误。
  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 -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

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

于 2014-08-30T16:07:36.337 回答
0
grep http *.job | awk -F: '{print $1}' | sort -u | xargs -I {} qsub {}
于 2016-11-10T22:43:12.733 回答