JSch 指令輸出掛起:案例研究
透過JSch 執行指令時,您可能會遇到程式碼掛起的情況嘗試從程式碼ChannelExec 的輸入流中讀取資料時。要解決此問題,至關重要的是確保在監視命令狀態的同時連續讀取輸出。
考慮以下程式碼片段:
<code class="java">while ((numRead = reader.read(buf)) != -1) { // ... }</code>
如果指令產生大量輸出,它可以填入輸出緩衝區,導致指令在等待緩衝區被消耗時停止。這可能會導致死鎖情況。
要解決此問題,您應該連續讀取標準輸出和標準錯誤,監視命令狀態。這可確保輸出緩衝區保持為空,從而允許命令不間斷地完成。
<code class="java">while (true) { // Read from standard output while (in.available() > 0) { // Replace reader with in and err for error handling // ... } // Read from standard error while (err.available() > 0) { // Replace reader with in and err for error handling // ... } if (channel.isClosed()) { // ... } try { Thread.sleep(1000); } catch (Exception ee) { } }</code>
透過不斷讀取輸出和錯誤流並定期檢查通道狀態,可以防止掛起並確保命令成功完成。
以上是JSch 指令掛起:讀取大輸出時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!