簡體   English   中英

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

[英]How can I use a pipe or redirect in a qsub command?

我想在網格上使用需要使用管道( | )或重定向( > )的qsub(SGE 8.1.3,CentOS 5.9)運行一些命令。 例如,假設我必須並行化命令

echo 'hello world' > hello.txt

(顯然,一個簡單的例子:在現實中我可能需要一個程序的輸出重定向像領結直接samtools )。 如果我做了:

qsub echo 'hello world' > hello.txt

得到的hello.txt內容看起來像

Your job 123454321 ("echo") has been submitted

類似地,如果我使用了一個管道( echo "hello world" | myprogram ),那條消息就會被傳遞給myprogram ,而不是實際的stdout。

我知道我可以編寫一個小的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令人沮喪,其中有一些原因,其中我的程序甚至無法刪除之后的許多jobXX.sh腳本以便自行清理,因為我不知道作業在隊列中等待多長時間,以及作業開始時腳本必須在那里。

有沒有辦法向qsub提供我的完整echo 'hello world' > hello.txt命令, 不必創建包含該命令的另一個文件?

您可以通過將其轉換為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行為反而需要編譯代碼。 為此,你使用qsub的“-by”標志,你將避免任何“二進制模式所需的命令”或“腳本長度與聲明的長度不匹配”的錯誤。
  2. 回顯每次調用qsub,然后將其傳遞給shell。

假設你有一個文件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

這個頁面有你可能喜歡的有趣的qsub技巧

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM