[英]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只會導致一個作業被發送到隊列(即您的代碼將以串行方式運行而不是並行化)。
假設你有一個文件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
grep http *.job | awk -F: '{print $1}' | sort -u | xargs -I {} qsub {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.