2013-08-19 143 views
2

我想使用需要使用管道(|)或重定向(>)的qsub(SGE 8.1.3,CentOS 5.9)在網格上運行一些命令。舉例來說,假設我有並行命令如何在qsub命令中使用管道或重定向?

echo 'hello world' > hello.txt 

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

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 而不需要必須創建另一個包含該命令的文件?

+0

的重定向會的工作* shell *,不是python。 – devnull

+0

@devnull:你什麼意思?如果我直接在shell中輸入'qsub echo'hello world'> hello.txt' *,從不涉及Python,我會遇到上述問題,其中'hello.txt'包含文本'Your job ...'。 (我只是偶爾展示Python代碼來演示它是如何繞開它的麻煩)。 –

+1

不知道我完全理解這個問題,但是你可以'echo sleep 300 | qsub -o/foo -e/bar'將標準發送到/ foo,並將標準錯誤發送到/ bar – spuder

回答

5

你可以把它變成一個bash -c命令,它可以讓你把|中援引言論做到這一點:

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

由於@spuder在評論中所指出的,似乎在其他版本qsub(不是SGE 8.1.3,我正在使用),可以解決這個問題:

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

也是如此。

+0

顯然,重定向'''不適用於bash -c。是否有另一種寫入文件的方式? – highBandWidth

+0

@highBandWidth:對於重定向到一個文件,你總是可以做'-o outputfile.txt'作爲qsub的參數 –

+0

幾點意見:1.'bash -c'方法適用於'I',但不適用於'>' 。 2.回聲| qsub'方法適用於'|'和'>'。 3.'-o output.txt'方法也可以工作,但可能並不總是可取的(例如gzip輸出)。 – enricoferrero

2

雖然我的答案有點晚,但我爲任何新來的觀衆添加它。要使用pipe/direct並將其作爲qsub作業提交,您需要執行幾項操作。但是,首先,在管道末端使用qsub,只會導致將一個作業發送到隊列(即,您的代碼將以串行方式運行,而不是並行化)。

  1. 運行帶啓用二進制模式的qsub,因爲默認的qsub行爲相當期望編譯代碼。爲此,您可以使用「-b y」標誌指向qsub,避免排序「二進制模式所需命令」或「腳本長度與聲明長度不匹配」的任何錯誤。
  2. 將每次調用都回顯給qsub,然後將其傳遞給shell。

假設您有一個文件params-query。TXT持有幾個領結命令,並通過管道輸送到以下形式的samtools電話:

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

從STDIN通過xargs的標準輸入發送每個查詢作爲單獨的作業先準備好您的命令行的單位。注意,如果您要提交管道部件的命令,則括號內的引號非常重要。這樣你的整個查詢被視爲一個單元。

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

如果沒有按預期工作,那麼你可能會更好過產生的蝴蝶結和samtools之間的中間輸出調用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

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