shell脚本实现C程序日志分流和多Terminal显示
? ? 日志打印是軟件必需的功能,通常C程序會將所有運行日志輸出到指定LOG。
? ? 一、有時候需要在C程序運行期間查看實時日志,最好地,可以根據關鍵字篩選自己想要查看的內容。
? ? 二、有時候,希望另開Terminal去查看日志,而不是使用當前的Terminal。
? ? 實時篩選流,利用tail命令可以實現,流顯示則可以用tee命令;Linux設備自啟Terminal窗口,利用gnome-terminal命令實現(在gnome集成桌面環境)。
關于tail命令
? ? tail -f filename 會把 filename 文件里的最尾部的內容顯示在屏幕上,并且不斷刷新,只要 filename 更新就可以看到最新的文件內容。
關于tee命令
? ? tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。
關于gnome-terminal命令
? ? 如果想在啟動Terminal中自動執行命令,有兩個參數可以實現這個功能,-e和-x(或者"--"),這兩個區別在于:
"-e"可以出現多次,如果在所有--window前面,表示對所有window和tab起作用,如果在--window或者--tab后面,表示只針對這個tab執行,要注意-e后面只能有一個參數也就是說如果有空格,需要用引號(-e選項會被提示不適用,后面版本可能移除)。
"-x"只能出現一次,在-x后面的所有內容,均認為是要執行的命令,所以可以出現空格,這些命令是針對所有tab都執行的。
? ? 如果C程序直接將日志打印到屏幕,那么可以使用重定向符">"或者">>"將流先重定向到指定LOG文本,然后利用tail命令實時顯示到啟動的Terminal窗口:
gnome-terminal --title="LOG_PRINT" -- bash -c "tail -f ./test.log"
? ? 利用"bash -c"在bash里面再啟用一個bash,執行log的分流命令(避免在test.log未增加時新開Terminal閃退)。
對于日志的篩選可以使用正則表達式作為篩選條件或者shell腳本的命令行參數,腳本判斷篩選條件之后動態創建多個分流Terminal窗口顯示包含指定關鍵字的日志內容。類似于:
/INFO/p
/ATA*|BTB*/p
? ? ?“/p” 打印,如果同時指定行,表示打印指定行;如果不指定行,則表示打印所有內容;如果有非打印字符,則以 ASCII 碼輸出。其通常與“-n”選項一起使用。
????利用for循環動態處理分流條件RE,將主日志分流導入到各分日志并顯示在窗口:
touch $TESTLOG
for (( i =1; i < $#; i++))doRE=$1eval RE="$"$iTERMINAL_TITLE=RE_NO."$1"_LOGPRINTtouch $LOGPATH/RE_$i.logecho "RE_NO.${i}_LOGPRINT display result of regular expression: $RE"CMD="tail -f $TESTLOG | sed -un \"$RE\" | tee RE_$i.log"gnome-terminal --title="$TERMINAL_TITLE" -- bash -c "$CMD"shiftdone
fi
? ? 另外在這之后新開一個Terminal用于顯示所有日志:
gnome-terminal --title="MAIN_LOGPRINT" -- tail -f $TESTLOG
? ?最后考慮執行c程序:
./Test >> $TESTLOG
? ? 把C程序執行放到腳本的最后是為了使用CTRL+C可以一鍵終止C程序的打印,否則將失去對C程序的控制,因為shell腳本默認以腳本最后一個進程接收CTRL+*命令。所以這里執行命令的順序是重點需要注意的地方,也因此在前面會使用bash命令。
? ?另外,程序輸出有兩種方式:一種是即時處理方式,另一種是先暫存起來,然后再大塊寫入的方式,前者往往造成較高的系統負擔。因此,c語言默認按塊輸出。為了讓日志可以實時刷新,還需要在C程序中設置輸出緩存:
setbuf(stdout, NULL);
?
總結
以上是生活随笔為你收集整理的shell脚本实现C程序日志分流和多Terminal显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李易峰的qq号是多少?
- 下一篇: 铝合金窗多少钱一平方啊?