2012-02-10 66 views
0

在將問題標記爲重複之前,請閱讀我遇到的各種問題。一點背景:我們正在開發一個運行在嵌入式ARM sbc上的C++應用程序,使用debian linux的一個精簡版變體。應用程序從啓動腳本啓動時開始啓動,並將各種信息輸出到stdout。我們希望能夠使用SSH/Telnet進行連接並讀取應用程序輸出,而無需終止進程並重新啓動當前bash會話。我想爲非技術型人士創建一個簡單的.sh腳本。從一個進程讀取標準輸出(linux嵌入式)

這裏發佈的similar question的第一個解決方案是使用gdb。首先它不是用戶友好的(需要手動編寫多個命令),我不知道爲什麼,但似乎沒有輸出任何東西到文件中。

第二個解決方案strace -ewrite -p PID完美地工作,這就是我想要的。問題是,比標準輸出有更多的信息,並且格式不正確。

我設法得到一個「可接受」的結果strace -e write=1 -s 1024 -p 20049 2>&1 | grep "write(1,"但它仍然有多餘的write(1, "...", 19) = 19文本。到目前爲止,這只是一些字符串格式化,我在其他頁面上發現這條線表示它實現了很好的格式化:strace -ff -e write=1,2 -s 1024 -p PID 2>&1 | grep "^ |" | cut -c11-60 | sed -e 's/ //g' | xxd -r -p

在這個命令中有一些東西我覺得奇怪(爲什麼-ff ?,爲什麼grep「^ |」?,爲什麼在那裏使用xxd?),並且它只是在我嘗試時不輸出任何東西。

不幸的是,我們確實使用了busybox(1.7.1)的老bug版本,它有多個管道的問題。該錯誤給我帶來不好的結果。例如,如果我只做grep,它的工作原理,如果我只切斷它也行,但我們說「grep」寫(1,「| cut -c11-60」什麼都不返回。解決方案只是更新busybox並使用這些多個管道來格式化字符串,但我們無法更新它,因爲os發行版已經安裝在運往我們全球客戶的數千塊主板上..

任何人都有奇蹟解決方案?謝謝

+0

您的「lite」Linux是否帶有程序「屏幕」,或者您可以爲其構建屏幕? – 2012-02-11 02:00:36

+0

屏幕不存在,但可能很容易構建。似乎它可以很好地工作,但我不喜歡與strace不同的事實,屏幕必須是應用程序的父進程,並且不能只連接到已經運行的應用程序。 – Dunge 2012-02-13 14:42:12

回答

0

屏幕可以使用reptyr連接到現有進程(http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/ ),或者你可以使用neercs(http://caca.zoy.org/wiki/neercs)使用但顯然是像屏幕,但支持附加到現有的過程本身。