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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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





