靈活使用stdout和stderr,優(yōu)化EDA的LOG捕獲
掃描二維碼
隨時(shí)隨地手機(jī)看文章
EDA工具的log(日志)捕獲,是一個(gè)經(jīng)常會(huì)用到的功能,有助于用戶查看long run job的狀態(tài)和錯(cuò)誤捕獲,這里一般是利用了linux下的重定向(redirect)或者輸出捕獲(tee),這里通過對(duì)linux這兩個(gè)命令的學(xué)習(xí)梳理,用戶可以根據(jù)自身需要,優(yōu)化EDA工具的LOG捕獲工作。閑言少敘,ICer GO!
在Linux下,對(duì)于IO管理有三個(gè)標(biāo)記,分別如下:
0:stdin 1:stdout 2:stderr
PTS的理解
可以看到,無論是0/1/2最后都會(huì)指向/dev/pts/166這個(gè)終端號(hào)(166),可以理解,這個(gè)166終端既可以接受stdin,也可以打印stdout(如上所述)和stderr,用戶在/dev/fd目錄下,可以看到類似下面的結(jié)構(gòu):

PTS是linux下的虛擬終端(pty)的一種實(shí)現(xiàn)方法。這里的/dev/pts/166可以簡(jiǎn)單的理解為當(dāng)前用戶的具象化的虛擬終端tty。
這里表達(dá)的意思是:當(dāng)前的偽終端的所有打印都會(huì)通過/dev/pts/166這個(gè)“設(shè)備”完成,這個(gè)“設(shè)備”既可以接受stdin,也可以輸出stdout和stderr。
stdin(0):
在linux下,所有的輸入對(duì)被歸為stdin,可以是鍵盤輸入,也可以是文件輸入,鍵盤輸入在此不贅述。
文件輸入需要借助于輸入重定向<實(shí)現(xiàn)

抑或利用0(stdin)結(jié)合輸入重定向?qū)崿F(xiàn):
stdout(1):
輸出重定向到指定設(shè)備
linux下的重定向符>,可以指向固定設(shè)備,譬如這里重定向到/dev/tty,就會(huì)帶來一種類似屏幕打印的效果。

也可以指向linux的"null設(shè)備"。
輸出重定向到指定文件
相較于重定向到設(shè)備,linux下的輸出重定向符更多的是指向指定文件,譬如下例:

在使用重定向stdout命令的時(shí)候,如果命令的返回只有stdout,那么這個(gè)命令不會(huì)有任何返回信息,所有的信息都被重定向到指定文件中去了。
由于默認(rèn)的>的行為是對(duì)stdout的重定向,這里就近似等同于1>,所以,一種對(duì)stdout,更為完整的重定向?qū)懛ㄈ缦滤荆?/span>
stderr(2):
日常的使用中,用戶不可能保證每一個(gè)命令都可以正常執(zhí)行,在這種情況下,命令的返回信息可能就會(huì)參雜非stdout的信息,linux將這一類歸為stderr。譬如下例:

這里用戶嘗試ls 一個(gè)不存在的文件f4.txt。可以看到,這個(gè)時(shí)候在使用重定向輸出命令的時(shí)候,終端上有了一個(gè)錯(cuò)誤的信息輸出,來表述f4.txt這個(gè)文件是不存在的。
如果這個(gè)時(shí)候查看輸出重定向的消息,f1234.log??梢钥吹剑@里只有正常的文件信息,所以,正常的重定向命令,確實(shí)只是捕獲了stdout,如果用戶的想實(shí)現(xiàn)stderr的重定向,需要使用下面的方法:

這個(gè)時(shí)候需要借用2>來描述對(duì)于stderr信息的處理,通過上述例子,屏幕上并沒有任何信息輸出,這里的stdout和stderr分別被重定向到f123.log和f4.log文件里了。
類似的用戶也可以只針對(duì)stderr進(jìn)行重定向,譬如:

這個(gè)時(shí)候,屏幕上會(huì)把正常的stdout打印出來,stderrr信息被保留到了f4.log。
由于默認(rèn)的>的行為是對(duì)stdout的重定向,這里就近似等同于1>,所以,一種對(duì)stdout/stderr,更為完整的重定向?qū)懛ㄈ缦滤荆?/span>
stdout和stderr重定向同一文件
有些情況下,用戶不想將stdout和stderr分開,這樣的好處是可以把命令執(zhí)行的所有信息都捕捉下來(stdout+stderr),這個(gè)時(shí)候需要用到一個(gè)修飾符&,譬如下例:

這里的重定向符號(hào)結(jié)合了修飾符,變成了&>,所有的stdout和stderr都會(huì)被重定向到f1234.log里邊了。
常言道條條大路通羅馬,linux就是古諺的忠實(shí)踐行者,通過命令后綴2>&1的方式,也可以實(shí)現(xiàn)上述功能,具體見下:

這個(gè)方式是將stderr先重定向到stdout,然后在同一將stdout 重定向到f1234.log。
PS:對(duì)應(yīng)的也可以對(duì)stdout做重定向,有興趣的小伙伴可以試一下
重定向和屏幕捕獲(tee)異同
在日常的工作中,由于EDA工具的日志都會(huì)比較長(zhǎng),如果簡(jiǎn)單的使用重定向,那么命令行在EDA任務(wù)完成前,屏幕都不會(huì)有任何回顯,這個(gè)時(shí)候會(huì)給人一些EDA工具運(yùn)行出錯(cuò)的誤判,所以在日沖工作中,更多的工程師喜歡使用屏幕捕獲(tee)這個(gè)命令:EDA工具在打印信息到屏幕上的時(shí)候,同時(shí)也會(huì)將屏顯內(nèi)容捕獲到指定文件中:
譬如:

但是tee一樣會(huì)有類似重定向的問題,就是對(duì)于stdout和stderr的分別對(duì)待,這個(gè)從tee的manual可以看到

所以說tee只能捕獲屏幕上的stdout信息,而不能去捕獲stderr的信息,雖然stdout和stderr都會(huì)出現(xiàn)在屏幕上,譬如下例:

但是對(duì)于EDA用戶,這個(gè)是不方便的,用戶總是期望捕獲命令的所有輸出。結(jié)合上述講解,也可以借助修飾符&讓tee完成這個(gè)任務(wù):
- 方法一:使用命令|&進(jìn)行捕獲,譬如下例:

方法二:對(duì)stderr進(jìn)行重定向后處理后的,而后用tee對(duì)stdout進(jìn)行捕獲
shell的異同
由于bash是linux默認(rèn)的shell,這里對(duì)stdin/stdout/stderr(0/1/2)支持的很好,所以上述命令都可以正常使用,但是對(duì)于csh/tcsh這類基于C的shell,確實(shí)不能直接使用0/1/2進(jìn)行處理的
從上例可以看到,2這個(gè)在bash里邊標(biāo)記stderr的標(biāo)記字,在tcsh下是被當(dāng)作argument來處理的。但是tcsh的作者還是尊重原著的,使用修飾符&,就可以讓命令在bash/tcsh下實(shí)現(xiàn)兼容:

所以,對(duì)于shell之間,唯一的區(qū)別就是tcsh下無法將stdout和stderr分別處理,只能做合并,或者只捕獲stdout。
EDA工具日志捕獲實(shí)踐
經(jīng)過上邊的描述,用戶對(duì)于linux下的重定向和tee有了全面的認(rèn)識(shí),對(duì)于大部分日常的EDA工具,用戶使用常規(guī)對(duì)stdout處理的命令就可以了,但是對(duì)于S家的StarRC工具,這個(gè)可能有一點(diǎn)需要特殊處理,
用戶嘗試對(duì)StarXtract 命令的輸出進(jìn)行常規(guī)輸出重定向,但是這個(gè)時(shí)候盡管使用了>,但是屏幕上依然有輸出

這個(gè)時(shí)候,再看重定向的目標(biāo)文件,發(fā)現(xiàn)字節(jié)數(shù)竟然是0。

所以可以判定,StarXtract 這個(gè)命令的輸出都被判定為stderr。
方法一:重定向捕獲:用戶需要使用2>重定向StarXtract 命令輸出:

方法二:tee捕獲:用戶需要使用|&重定向StarXtract 命令輸出:
【敲黑板劃重點(diǎn)】
重定向是linux基礎(chǔ)的IO操作方式,都可以輕松使用0/1/2(bash下)進(jìn)行控制,但是對(duì)于tee這個(gè)屏幕捕獲的命令,是針對(duì)stdout的捕獲,和重定向相比,用戶只能選擇把steout或者stdout和stderr統(tǒng)一捕獲到同一文件中,不能分開捕獲,這個(gè)也是符合tee的設(shè)計(jì)初衷的。
對(duì)于所有的EDA工具的屏幕輸出,對(duì)于常見的shell(bash/tcsh/csh)用戶可以一勞永逸的是用 “|&”的方式對(duì)stdout和stderr將屏幕輸出全部捕獲出來





