我想使用需要使用管道(|
)或重定向(>
)的qsub(SGE 8.1.3,CentOS 5.9)在網格上運行一些命令。舉例來說,假設我有並行命令如何在qsub命令中使用管道或重定向?
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 而不需要必須創建另一個包含該命令的文件?
的重定向會的工作* shell *,不是python。 – devnull
@devnull:你什麼意思?如果我直接在shell中輸入'qsub echo'hello world'> hello.txt' *,從不涉及Python,我會遇到上述問題,其中'hello.txt'包含文本'Your job ...'。 (我只是偶爾展示Python代碼來演示它是如何繞開它的麻煩)。 –
不知道我完全理解這個問題,但是你可以'echo sleep 300 | qsub -o/foo -e/bar'將標準發送到/ foo,並將標準錯誤發送到/ bar – spuder