一個java中呼叫bash指令碼錯誤的診斷
背景:
系統是一個分散式架構,分為管理端和agent端。agent接收管理端命令,呼叫bash執行操作,獲取結果後返回管理端。中間以jms為通訊機制。
現象:
管理端呼叫agent有時會顯示jms超時。經查,指令碼可以單獨執行(不管執行結果如何,程式都能正常退出)。而agent中執行process.waitFor()的語句有時卻被block,直至超時。
分析:
由於指令碼看起來無錯,所以主要集中在看java呼叫bash的寫法,參考了多種,大同小異,問題仍然存在。經人指點,呼叫linux的程式操作,主要會和三個資料流打交道。一個是輸入流,對應java中Process物件的OutputStream,一個是輸出流,對應java中Process物件的InputStream,還有一個是錯誤流ErrorStream。我們在ErrorStream中發現了錯誤資訊。原來,指令碼會建立一個服務,並不斷呼叫某個命令檢測是否成功。在單獨執行指令碼時,該命令可以被指令碼直接呼叫,但在java呼叫時,由於執行的使用者不同,該命令無法執行而報錯。此外該檢測一直執行,所以整個被block。
解決:
- java執行bash的命令中加上-l,以宣告用登入使用者來執行指令碼。
- 檢測不是無休止,而是隔段時間檢測若干次後退出。
相關文章
- Bash 指令碼中的錯誤處理指令碼
- Python 指令碼中呼叫 Java 程式時 Classpath 錯誤Python指令碼Java
- RAC故障診斷指令碼指令碼
- java中呼叫groovy指令碼Java指令碼
- 一次網路連線錯誤的診斷
- Bash-Insulter:一個在輸入錯誤命令時嘲諷使用者的指令碼指令碼
- dbstart&dbshut指令碼中的錯誤指令碼
- 【RAC】Oracle Clusterware 診斷收集指令碼Oracle指令碼
- 【SQL】長事務診斷指令碼SQL指令碼
- 使用error stack診斷特定錯誤資訊Error
- 一個能夠生成 Markdown 表格的 Bash 指令碼指令碼
- 【PHP Whoops】錯誤&異常 診斷元件PHPOOP元件
- 查詢Tuxedo積壓的Oracle診斷指令碼UXOracle指令碼
- java遠端呼叫(rmi)常見的兩個錯誤Java
- 呼叫Frame中的指令碼指令碼
- 關於 Bash 指令碼中 Shebang 的趣事指令碼
- Bash指令碼指令碼
- 使用ErrorStack進行錯誤跟蹤及診斷Error
- 使用ErrorStack進行錯誤跟蹤及診斷!Error
- 診斷並解決ORA-04031 錯誤
- 在shell指令碼中呼叫另一個指令碼的三種不同方法(fork, exec, source)指令碼
- 執行指令碼寫入中間表錯誤返回錯誤資訊指令碼
- 利用errorstack事件進行錯誤跟蹤和診斷Error事件
- AIX_故障診斷_0516-062錯誤AI
- ASM啟動ORA-27125錯誤診斷ASM
- 使用ErrorStack進行Oracle錯誤跟蹤及診斷ErrorOracle
- 使用ERRORSTACK進行錯誤跟蹤及診斷(轉)Error
- 轉一個白老大的文章--- 一個診斷的思路
- Oracle技巧:如何診斷一些未預料的 Oracle 錯誤(ORA-NNNN)Oracle
- 執行shell指令碼報錯:-bash: ./test1.sh: /bin/bash^M: ...指令碼
- 如何診斷 Java 中的記憶體洩露Java記憶體洩露
- bash shell指令碼接受多個引數指令碼
- Linux編寫Bash指令碼的10個技巧Linux指令碼
- 編寫更好 Bash 指令碼的 8 個建議指令碼
- Oracle9i 官方文件建立資料庫指令碼的一個錯誤Oracle資料庫指令碼
- Arthas線上java程式診斷工具 線上除錯神器Java除錯
- Bash Shell指令碼中的陣列使用例項指令碼陣列
- MySQL故障診斷常用方法手冊(含指令碼、案例)MySql指令碼