送书 | 耗时很长的程序忘加nohup就运行了怎么办?
在NGS基礎:測序原始數據下載一文中提到可以使用SRA-toolkit中的命令fastq-dump從NCBI下載原始測序數據,命令如下。
nohup fastq-dump -v --split-3 --gzip SRR5908360 & nohup fastq-dump -v --split-3 --gzip SRR5908361 &這個代碼,給我們4個提示:
fastq-dump不只可以轉換下載好的sra文件為fastq文件,還可以順帶下載sra文件。
只需提供SRR號,就可以獲得FASTQ序列。
不需要先調用prefetch下載,然后再轉換。
其它參數解釋見引用文章。
每一行命令后面&號表示把命令放入后臺運行,當前終端可以繼續輸入其它命令;
此處也相當于實現了一個手動并行下載多樣本,配合for可以自動并行下載。
nohup表示讓程序在終端因人為原因或網絡原因斷開后不掛斷,適用于運行時間比較長的命令,一般與&連用,形式如nohup 你的命令 &?(注意空格的存在)。
如果程序運行輸出錯誤信息,則會寫入當前目錄下nohup.out文件里面,供后續查看和調試。
經常會有一些培訓班“拿來主義”比較嚴重,以上推文和生信寶典的其它推文都被發現過直接用于某些培訓班的教材,但從未申請過授權,也未引用過出處。
更有甚者,盜版易生信早期培訓教案和視頻,用于自己的課程或在全網發布,希望大家多多舉報。
言歸正傳,通常我們運行程序前,會有個預判,如前面那個例子,運行時間比較長,會使用nohup 我的命令 &的形式進行運行,從而保證程序不受網絡或終端異常退出的影響。
但有時也會有誤判,如沒想到某個程序運行了半個小時還沒結束,或數據傳輸時網太慢,需要傳輸很久,這時怎么辦?中止程序,然后加上nohup再從頭運行?還是有更好的辦法?
下面看這個例子:馬上要去吃午飯了,把文件同步到另一個服務器,飯后回來繼續操作:
ysx@ehbio:~/test/Bigwig$ rsync -av * ysx@46.93.19.14:/tmp ysx@46.93.19.14's password: sending incremental file list test1Y_DK10.bw輸入密碼后,發現同步速度太慢了,1分鐘只同步了1個文件,后面還有99個文件,待會離開后,如果網斷了,終端退出,程序終止怎么辦?同步不能完成,飯后怎么愉快的工作?
還好我們有下面的方案,一步步跟著操作,補救一下。
第一步,按ctrl+z把程序掛起,操作后屏幕會出現如下提示([1]中的1表示命令的作業號,后面會用到):
^Z [1]+ 已停止 rsync -av * ysx@46.93.19.14:/tmp第二步(可選),用jobs命令查看下任務狀態,跟剛才的屏幕提示一致,程序被暫時終止,作業號還是1:
ysx@ehbio:~/test/Bigwig$ jobs [1]+ 已停止 rsync -av * ysx@46.93.19.14:/tmp第三步,使用bg %1命令把作業號為1的任務放入后臺,并從停止狀態變為運行狀態,相當于加了&后接著運行。再用jobs查看,任務狀態變成了運行中,這一步很關鍵。如果沒有運行bg %1則程序處于停止狀態,一直不會運行,吃幾頓飯都不會運行。
ysx@ehbio:~/test/Bigwig$ bg %1 [1]+ rsync -av * ysx@46.93.19.14:/tmp & ysx@ehbio:~/test/Bigwig$ jobs [1]+ 運行中 rsync -av * ysx@46.93.19.14:/tmp &第四步,運行disown -h %1,表示在終端關閉時不對作業號為1的程序發送終止信號,外部因素將不影響程序的運行。通過ps命令查看下任務進程 (可選)。
ysx@ehbio:~/test/Bigwig$ disown -h %1 ysx@ehbio:~/test/Bigwig$ ps -auwx | grep 'rsync' ysx 18214 0.0 0.0 117844 1720 ? S 09:43 0:01 rsync -av *.bw ysx@46.93.19.14:/tmp ysx 18215 0.1 0.0 182376 8360 ? S 09:43 0:04 ssh -l ysx 46.93.19.14 rsync --server -vlogDtpre.iLsfxC . /tmp ysx 18340 0.0 0.0 112724 984 pts/1 S+ 10:17 0:00 grep --color=auto rsync通過以上4步就完成了對這次操作的事后補救。以后遇到同類問題,試一試這個新方案吧!
同時還有5點提示:
例子中使用的是rsync同步,從節省時間來看,不是一個很好的例子。
因為把命令停掉再運行一次時,已經同步完整的數據不會再同步,時間損失不會太大。
這也是使用同步命令rsync相比于scp的一個好處。
更多同步方式見(Linux服務器數據定期同步和備份方式。
例子中的rsync或其它涉及兩個服務器交互的命令,都需要我們人為輸入登錄密碼,因此直接加nohup &運行是行不通的,無法接受密碼的輸入。
因此通過上面這個操作先在前臺啟動運行、輸入密碼,再放入后臺不掛斷運行。
從這個角度看,是一個不錯的例子。
當然解決這個問題也有其它方式,具體見ssh免密碼登錄遠程服務器。
如果程序運行時,已加了&號,放入后臺了,則只需運行jobs獲得作業號,再運行disown不掛斷即可。
程序作業號不一定都是1,如果之前就有程序在后臺運行,作業號相應的會自加。
后面用到作業號時也需要相應修改,不要刻板總用1。
nohup和disown都可以使程序不掛斷,可以獲得一樣的效果,但原理不太一致。
nohup可以使程序忽略掛斷信號(SIGHUP)或者使程序脫離終端的控制,從而終端不能再對其發送掛斷信號(SIGHUP);
disown則是內生于shell,告訴shell在終止時不對對應程序發送掛斷信號(SIGHUP)。
送書
在上周的留言送書活動中,恭喜下面這位讀者獲得書籍“Python數據分析與大數據處理:從入門到精通”,請及時與生信寶典編輯(shengxinbaodian)聯系。
高級教程和生信基礎知識在生信寶典往期推文中都有,贈送的書籍可以作為一類延伸閱讀擴展知識面。
本期的留言主題是:分享一下在運行代碼或程序中有什么需要注意到的地方?歡迎轉發朋友圈并留言評論。
留言得贊最高者將獲得下面由北京大學出版社贊助的書籍(聯系小編時請附上分享截圖),歡迎分享,結果在下一期送書活動中公布:
循序漸進式教學:本書由基礎數據處理(base-r)—簡潔高效數據處理(tidyverse生態系統)—高速數據處理(data.table)—分布式數據處理(sparklyr),從基礎到進階操作,一應俱全。
引導式教學:本書由淺入深,分層次講解,每個知識點都配有可實現的代碼輔助理解。
案例式教學:本書實戰應用部分涵蓋數據搜集、數據處理、網絡爬蟲、文本挖掘、數據可視化、機器學習等多個領域,代碼可直接用于實際工作和生活中。
總結
以上是生活随笔為你收集整理的送书 | 耗时很长的程序忘加nohup就运行了怎么办?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的导师是哪种类型?
- 下一篇: 什么是倾斜45度的火山图?