国产成人毛片毛片久久网_国产午夜激无码av毛片不_国产乱对白精彩在线播放_av资源站中文字幕_亚洲男人的天堂网站_国产成 人 综合 亚洲网_中国国产激情一区_少妇一级淫片免费放_亚洲一本大道av久在线播放_免费观看美女裸体网站

行業(yè)動(dòng)態(tài)

防御吧作為15年知名老牌域名服務(wù)商,CNNIC和CANN雙認(rèn)證域名注冊(cè)商,已經(jīng)
持續(xù)為500多萬個(gè)域名提供服務(wù),包括智能DNS/自由轉(zhuǎn)移/隱私保護(hù)等服務(wù)!
Linux中標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的重導(dǎo)向
2020-12-30 14:19:14 【

如果一個(gè)命令需要長時(shí)間在服務(wù)器上運(yùn)行,那么很多時(shí)候會(huì)用到nohup命令,這時(shí)即便遠(yuǎn)程登錄ssh中斷了與服務(wù)器的聯(lián)系,那么在服務(wù)器上運(yùn)行的命令也不會(huì)因此而被迫停止。

通常情況下,nohup與&連用,&的意思是將該命令放在后臺(tái)執(zhí)行。如下:

nohupexample.sh &

將exmaple.sh通過&放在服務(wù)器后臺(tái)運(yùn)行,nohup確保了即便當(dāng)前ssh遠(yuǎn)程連接中斷,example.sh仍然能夠不受影響,繼續(xù)在遠(yuǎn)程服務(wù)器中運(yùn)行。

最近有兩個(gè)配對(duì)測序文件,需要比對(duì)到參考基因組上,通過bwa可以完成,同時(shí)由于該文件比較大,運(yùn)行時(shí)間長,為了避免網(wǎng)絡(luò)連接不穩(wěn)定造成ssh中斷,使用nohup

nohupbwamemref.faread1.fq.gzread2.fq.gz > read12.sam &

將兩個(gè)測序文件合并并生成sam文件。
寫好命令,一個(gè)回車鍵按下去,“啪”一聲,那就一個(gè)爽。然后不用管它,十余個(gè)小時(shí)之后,果然生成了一個(gè)很大的文件read12.sam文件。
但是,當(dāng)用該sam文件生成bam文件時(shí),提示錯(cuò)誤sam文件存在錯(cuò)誤。!【十余個(gè)小時(shí)的計(jì)算白費(fèi)了】
仔細(xì)檢查了一下sam文件,發(fā)現(xiàn)程序運(yùn)行的結(jié)果和程序運(yùn)行過程中的說明輸出到了同一個(gè)文件中!

1、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤

標(biāo)準(zhǔn)輸出(standard output)即結(jié)果默認(rèn)的輸出地方,比如在bash中,

$echo'hello'hello

在默認(rèn)狀態(tài)下,’hello’時(shí)輸出到你的終端(terminal)上顯示。
再如,通過cat命令顯示一個(gè)文本文件,

$ cat hello.txtHello!This is a test!

但是,如果這個(gè)文本文件在當(dāng)前路徑下不存在,在會(huì)輸出錯(cuò)誤:

$ cat No_exist.txt
cat: No_exist.txt: No such file or directory
這時(shí)的輸出內(nèi)容“cat: No_exist.txt: No such file or directory”就是標(biāo)準(zhǔn)錯(cuò)誤(standard error)。

2、重導(dǎo)向輸出

默認(rèn)情況下,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都會(huì)在終端顯示。如果要將標(biāo)準(zhǔn)輸出不是輸出在終端,而是輸出到一個(gè)其他文件中,這個(gè)時(shí)候就是重導(dǎo)向輸出,可以通過“>“符號(hào)來完成。

echo'hello' > hello.txt

將“hello”輸出到hello.txt文件中,系統(tǒng)會(huì)新創(chuàng)建該文件,如果路徑中存在該文件,舊的文件將會(huì)被覆蓋。
還可以使用”>>”符號(hào),這樣不會(huì)覆蓋舊文件,會(huì)將”hello”添加到舊文件中。
那么,這兒有一個(gè)問題,是不是所有輸出到終端的內(nèi)容都可以重導(dǎo)向輸出到一個(gè)文件中?比如,如果是標(biāo)準(zhǔn)錯(cuò)誤,能否通過”>”輸入到文件中?

$ cat No_exist.txt > output.txtcat: No_exist.txt: No such file or directory

結(jié)果證明:不能!output.txt依舊是一個(gè)空文件,而錯(cuò)誤內(nèi)容并沒有出現(xiàn)在該文件中,依舊在終端顯示!所以不能直接通過”>”將標(biāo)準(zhǔn)錯(cuò)誤輸出到文件中!
那么應(yīng)該怎樣才能將標(biāo)準(zhǔn)錯(cuò)誤輸出到文件中呢?

3、文件描述符

在bash中,通常使用3個(gè)整數(shù)來表示標(biāo)準(zhǔn)輸入(0)、標(biāo)準(zhǔn)輸出(1)和標(biāo)準(zhǔn)錯(cuò)誤(2)。
如果要把標(biāo)準(zhǔn)錯(cuò)誤輸出到文件中,可以使用

catNo_exist.txt 2> tt.txt

這時(shí)在tt.txt文件中就會(huì)出現(xiàn)標(biāo)準(zhǔn)錯(cuò)誤“cat: No_exist.txt: No such file or directory”。
同樣的道理,我們可以將標(biāo)準(zhǔn)錯(cuò)誤重導(dǎo)向輸出為標(biāo)準(zhǔn)輸出,2>&1
比如

$ cat No_exist.txt cat: No_exist.txt: No such file or directory$ cat No_exist.txt 2>&1cat: No_exist.txt: No such file or directory

雖然它們?cè)诮K端上輸出的內(nèi)容看起來沒有什么區(qū)別,但是它們的身份是不一樣的,第一個(gè)是以標(biāo)準(zhǔn)錯(cuò)誤的形式輸出的,而第二個(gè)是標(biāo)準(zhǔn)輸出。我們可以通過管道符號(hào)驗(yàn)證一下它們的不同。

$ cat No_exist.txt | sed 's/or/and/'cat: No_exist.txt: No such file or directory$ cat No_exist.txt 2>&1| sed 's/or/and/'cat: No_exist.txt: No such file and directory

現(xiàn)在可以看出區(qū)別了,第一個(gè)標(biāo)準(zhǔn)錯(cuò)誤無法通過管道符號(hào)把“or”替換成“and”,而第二個(gè)是標(biāo)準(zhǔn)輸出,可以通過管道符號(hào),把其中的“or”替換成“and”.
同樣的道理,也可以將標(biāo)準(zhǔn)輸出重導(dǎo)向?yàn)闃?biāo)準(zhǔn)錯(cuò)誤“1 >2&“

那么回過頭來,看最開始的那個(gè)問題,為什么nohup同時(shí)會(huì)運(yùn)算結(jié)果和運(yùn)算過程的描述輸出到同一個(gè)sam文件中呢?
為了簡便,用下面的代碼(example.sh)重現(xiàn)了nohup中的錯(cuò)誤。

#!/bin/bashecho"this is outcome!"sleep 1echo"sleep for 1s" >&2echo"this is outcome, too!"sleep 2echo"second sleep for 2s" >&2

其中sleep的過程描述通過 >&2以標(biāo)準(zhǔn)錯(cuò)誤的形式出現(xiàn),而outcome則以標(biāo)準(zhǔn)輸出的形式輸出。
正常情況下,運(yùn)行:

$ ./example.sh > outcome.txtsleep for1ssecond sleep for2s$ cat outcome.txt thisis outcome!thisis outcome, too!

標(biāo)準(zhǔn)錯(cuò)誤直接輸出到了終端中,運(yùn)行結(jié)果輸出到了outcome.txt中,沒有任何問題。但是在nohup的情況下,這種情況就變了。
在nohup的說明中,提到“如果標(biāo)準(zhǔn)輸出是在終端,那么輸出的內(nèi)容將會(huì)被添加到‘nohup.out’文件中;如果標(biāo)準(zhǔn)錯(cuò)誤的輸出是在終端,那么內(nèi)容將會(huì)被重導(dǎo)向到標(biāo)準(zhǔn)輸出“。這就意味著,在沒有特殊說明的情況下,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤將會(huì)被重導(dǎo)向輸出到同一個(gè)地方。如下,

$ nohup ./example.sh appending output to nohup.out$ cat nohup.outthisis outcome!sleep for1sthisis outcome, too!second sleep for2s

在nohup.txt文件中不僅出現(xiàn)了我想要的運(yùn)行結(jié)果,還出現(xiàn)了我不想要的運(yùn)行過程!這也就解釋了為什么在我的sam文件中會(huì)出現(xiàn)很多本不應(yīng)該屬于該文件的內(nèi)容。
既然知道了原因,那么解決問題就不難了。我們可以通過重導(dǎo)向輸出,把運(yùn)行結(jié)果和運(yùn)行過程分別輸出到不同的文件中。

$ nohup ./example.sh 2>stderr.log1>outcome.txt$ cat stderr.log sleep for1ssecond sleep for2s$ cat outcome.txt this is outcome!this is outcome, too!

這樣,將過程以標(biāo)準(zhǔn)錯(cuò)誤形式輸出到stderr.log中,將結(jié)果以標(biāo)準(zhǔn)輸出形式輸出到outcome.txt中。
所以本文最開頭提到的命令可以改為:

nohupbwamemref.faread1.fq.gzread2.fq.gz 1> read12.sam 2>read12.log &

總結(jié)

nohup在默認(rèn)條件下,標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出會(huì)重導(dǎo)向到同一個(gè)文件中;通過文件描述符(0,1,2)來對(duì)控制輸出內(nèi)容;養(yǎng)成良好的輸出控制習(xí)慣,對(duì)標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤要區(qū)別對(duì)待。


】【打印關(guān)閉】 【返回頂部
分享到QQ空間
分享到: 
上一篇為什么服務(wù)器的CC防護(hù)做不好?了.. 下一篇使用WordPress搭建的網(wǎng)站,如何阻..

立足首都,輻射全球,防御吧專注云防御及云計(jì)算服務(wù)15年!

聯(lián)系我們

服務(wù)熱線:13051179500 18910191973
企業(yè)QQ:1245940436
技術(shù)支持:010-56159998
E-Mail:xihedata.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解決防御與加速) 版權(quán)所有 增值許可:京B2-20140042號(hào)
售前咨詢
公司總機(jī):18910191973
24小時(shí)電話:010-56159998
投訴電話:18910191973
值班售后/技術(shù)支持
售后服務(wù)/財(cái)務(wù)
備案專員
緊急電話:18610088800