2014-03-19 72 views
2

我想輸出和錯誤重定向到一個插座,我就可以使用遠程監視我的應用程序通過以太網的狀態。目前我通過使用ssh並在shell控制檯中查看輸出來完成此任務。如果可能,我寧願刪除中間人,只是將整個stdout和stderr輸出發送到udp或tcp/ip端口,並讓我的監控計算機連接到它。的Linux:輸出和錯誤套接字

我不能使用UART或其他任何有線連接。它必須是以太網。另外,如果可能的話,我想通過一個bash腳本來完成,以防止重建我的應用程序。

感謝您的幫助。

回答

4

你描述它的方式,它聽起來就像你去需要或者現有的應用程序打開一個被動套接字,等待連接,或者你將不得不在包裝的東西,建立一個監聽套接字應用程序。 This post暗示在Bash中是不可能的,但它確實顯示了使用netcat或perl命令行的方式。例如,你可以做這樣的事情與netcat的:nc -l -p <port> -c "tail -F /var/log/blah"

2

在監控應用程序方面,有兩路輸出重定向到出站連接,使用netcat的一種方式:

$ ./application 2>&1 | nc <remote-host> <remote-port>

這樣,您將stderr重定向到stdout,然後將它們一起管道到netcat,這將負責設置套接字,建立與遠程主機和所有東西的連接。

但是,請記住,如果這是您用來寫入stdout的函數,則您可能遭受printf()的緩衝。在我的本地測試中,我發現應用程序發送到stderr的數據立即在另一個偵聽端看到,但另一方面,發送到stdout的數據僅在應用程序退出或數據庫中有足夠數據時發送緩衝區一次沖洗。因此,如果您關心監控端信息的順序和可用性,我建議您在打印stdout有趣的內容時撥打電話fflush(stdout);,或者將撥打電話printf()fprintf()等替換爲write() ,它不會緩衝。缺點是你必須觸及應用程序的代碼,當然,但我不知道有任何方法可以從外部強制刷新應用程序的輸出緩衝區(即從bash)。

+0

我建議你改變NC命令'NC -l '讓應用程序等待顯示器連接,如OP描述。 – thuovila

+0

爲unbuffering標準輸出的其他方式https://stackoverflow.com/questions/3465619/how-to-make-output-of-any-shell-command-unbuffered – thuovila

+0

@thuovila描述不,我認爲'nc'命令是正確的,因爲這發生在「客戶端」,它將連接到監視「服務器」並將應用程序的輸出發送給它。在監視「服務器」時,'-l'是有意義的,但不是在通信的這一邊(如我的第一句話中所述) – asamarin