怎麼用truss監控程序

2021-08-30 22:20:42 字數 1102 閱讀 9487

最近因為乙個程式bug需要用truss監控程序的系統呼叫情況。一點心得,記錄在此。

原因是乙個c++程式,在呼叫system()方法時,有時會變得很慢,所以用truss監控一下**出了問題。

首先是引數,-d 可以顯示每條系統呼叫的時間花費,-d 可以顯示時間戳,最重要的是-f , 因為是通過system()方法呼叫系統方法,會fork新的程序,所以要用-f 監控子程序的狀況。

還有一點就是,我的程序在sun cluster 監控之下,所以要先釋放出來

/usr/cluster/lib/sc/pmfctl -s $pid
然後是truss 命令

truss -ddeal -t '!lwp_park' -f  -o truss.out -p $pid
使用-t '!lwp_park' 過濾掉不必要的輸出,-o 指定輸出的檔案, -p 指定監控的程序號

這樣對一般的需求應該夠了,但是要長期監控的話,輸出就會很多,而且因為是truss自己控制輸出,我們再來針對truss.out 做rotate就會遇到麻煩,比如,你如果用命令

echo "" > truss.out

touch truss.out

嘗試清空內容的話,你會發現檔案大小沒有變化,用vi開啟,內容的確沒了,但是你會發現vi顯示有很多的 null character,用less命令開啟就會發現很多的^@。我曾經嘗試過很多方法,都沒辦法真正的rotate原始的truss.out。

解決辦法也很簡單,那就是不要用-o 選項去指定輸出檔案,而是用重定向(redirect),但是你如果直接用

truss -ddeal -t 'lwp_park' -f -p $pid > truss.out
你會發現輸出仍然在螢幕,查一下你就知道,truss的輸出是到標準錯誤輸出

truss -ddeal -t '!lwp_park' -f  -p $pid >> truss.out 2>&1  &
這樣就可以了,你可以對輸出檔案作任何操作了。

相同的還有time 命令

time truss -ddeal -t '!lwp_park' -f $command >> truss.out 2>&1 &
這樣可以記錄整個命令的執行時間。

用Python寫個程序監控程式

有個應用程式不是很穩定,又暫時找到具體問題,只知道出現錯誤時日誌檔案會反映出來.該應用定時更新日誌目錄,有兩個日誌檔案 fromclient.log 記錄接收請求,fromserver.log記錄接收服務端返回.出現問題時一般是fromclient.log日誌在更新,但是fromserver.log...

用Python寫個程序監控程式

有個應用程式不是很穩定,又暫時找到具體問題,只知道出現錯誤時日誌檔案會反映出來.該應用定時更新日誌目錄,有兩個日誌檔案 fromclient.log 記錄接收請求,fromserver.log記錄接收服務端返回.出現問題時一般是fromclient.log日誌在更新,但是fromserver.log...

用飛信監控GoldenGate程序

監控goldengate程序 1 在goldengate安裝目錄下建立檔案ogginfo vim ogginfo info all 2 配置飛信報警 mkdir usr local sms 將飛信 包上傳到sms目錄,並將所有者賦予oracle 3 配置監控指令碼vi usr local bin g...