我在去年整理了一個(gè)關(guān)于多行命令并行管理的腳本「submit.sh」,前些日子曾老師發(fā)來(lái)消息提供了更新的版本当叭,今天我們一起來(lái)探討一下茬故。
之前的submit.sh主要是通過(guò)循環(huán)盖灸,將所有的命令分成多個(gè)批次蚁鳖,一個(gè)批次完成后才會(huì)運(yùn)行下一個(gè)批次。
#?submit.sh
#?把命令分為10份并行
for?i?in?{0..9};do?(nohup?bash?submit.sh?script2.sh?10?$i?2>&1);done?
今天要介紹的多行命令并行管理主要是基于xargs這個(gè)命令赁炎。
ls?*fastq?|?xargs?-iF?-P?10?sh?-c??'gzip?F'
xargs
關(guān)于xargs的用法我曾在之前的推文有提過(guò)醉箕,不過(guò)沒有深入太多。
本次主要用到它以下幾個(gè)參數(shù)
「-i」, --replace[=R], replace R in INITIAL-ARGS with names read from standard input; if R is unspecified,assume {} : 將xargs傳遞的內(nèi)容一行一行賦值給 {}徙垫,「-iF」即將xargs的輸出一行一行賦值給F讥裤。
「-P」, --max-procs=MAX-PROCS ? ?run at most MAX-PROCS processes at a time : 最大進(jìn)程數(shù)
sh
關(guān)于sh命令的用法,可以查看我提供的參考資料[1]姻报,本文主要使用以下參數(shù)
- 「-c」, 從-c后的字符串中讀取命令
- 「-x」, 打印出所執(zhí)行的命令以及當(dāng)前狀態(tài)
特殊符號(hào)
- 「''」, 單引號(hào)己英,保持引號(hào)里的內(nèi)容不變
- 「“”」, 雙引號(hào),解析引號(hào)里的命令和變量
- 「``」, 反引號(hào)吴旋,引號(hào)內(nèi)部為命令损肛,與$()等價(jià)
示例
以fastqc質(zhì)控為例,本次測(cè)試數(shù)據(jù)為GSE145894中的三個(gè)數(shù)據(jù)SRR11178348荣瑟、SRR11178349治拿、SRR11178350,前面的步驟就不多做展示笆焰,直接從fastqc質(zhì)控開始。
一共有6個(gè)文件,每次運(yùn)行3個(gè)試試
ls?*.gz?|?xargs?-iF?-P?3?sh?-c?'fastqc?-o?./?F'
我們使用htop查看xargs的進(jìn)程情況拂玻,發(fā)現(xiàn)其處在休眠狀態(tài)(S)首量,PID是28925。
kill掉該進(jìn)程后不皆,我們發(fā)現(xiàn)只有第一批次的三條命令運(yùn)行完成贯城,當(dāng)這一批的命令結(jié)束以后,后面將不再運(yùn)行下一批的命令粟焊。
小結(jié)
使用xargs的好處是可以將該命令寫入到代碼中冤狡,適用于流程搭建的情況(如snakemake)孙蒙;而之前的submit.sh只能在腳本外面使用,實(shí)際上還會(huì)產(chǎn)生多個(gè)PID悲雳。在遇到特殊情況需要kill任務(wù)的情況挎峦,使用xargs就可以直接kill母命令的PID,而submit.sh只能一個(gè)個(gè)的kill或killall合瓢。
另外需要注意的是坦胶,xargs 只能傳遞單個(gè)變量(本文中為F),上述命令通過(guò)-iF來(lái)傳遞ls輸出的內(nèi)容晴楔;當(dāng)需要輸入多個(gè)文件的時(shí)候(如比對(duì))顿苇,似乎是沒辦法實(shí)現(xiàn)的。
歡迎各位交流討論税弃。