Rumah  >  Artikel  >  Java  >  Mengapa arahan JSch saya tergantung semasa membaca output?

Mengapa arahan JSch saya tergantung semasa membaca output?

DDD
DDDasal
2024-10-31 00:33:30715semak imbas

Why is my JSch command hanging while reading output?

Memahami Isu Pembacaan Output Perintah JSch

Dalam kod Java yang anda sediakan menggunakan JSch, anda menghadapi situasi di mana atur cara digantung semasa cuba membaca daripada aliran pembaca yang digunakan untuk menangkap output arahan. Artikel ini menerangkan punca isu ini dan menyediakan penyelesaian.

Analisis Masalah

Isu asas timbul daripada tidak menggunakan output yang dihasilkan secara berterusan oleh arahan yang dilaksanakan. Perintah JSch mengumpul output dalam penimbal dalaman, dan jika penimbal terisi sebelum digunakan, ia boleh menyebabkan kebuntuan, di mana perintah itu tergantung menunggu penimbal dikosongkan.

Penyelesaian

Untuk menyelesaikan masalah ini, anda mesti terus membaca kedua-dua output standard dan aliran ralat standard arahan, walaupun semasa menunggu arahan selesai. Ini memastikan penimbal keluaran tidak pernah terisi dan arahan tidak digantung.

Kod Contoh

Berikut ialah versi lanjutan kod anda yang menggabungkan penyelesaian ini:

<code class="java">ChannelExec channel = (ChannelExec)session.openChannel("exec");

channel.setCommand(...); // Set the command to execute

ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream();
ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream();

InputStream in = channel.getInputStream();
InputStream err = channel.getExtInputStream();

channel.connect();

byte[] tmp = new byte[1024];
while (true) {
    while (in.available() > 0) {
        int i = in.read(tmp, 0, 1024);
        if (i < 0) break;
        outputBuffer.write(tmp, 0, i);
    }
    while (err.available() > 0) {
        int i = err.read(tmp, 0, 1024);
        if (i < 0) break;
        errorBuffer.write(tmp, 0, i);
    }
    if (channel.isClosed()) {
        if ((in.available() > 0) || (err.available() > 0)) continue; 
        System.out.println("exit-status: " + channel.getExitStatus());
        break;
    }
    try { 
      Thread.sleep(1000);
    } catch (Exception ee) {
    }
}

System.out.println("output: " + outputBuffer.toString("UTF-8"));
System.out.println("error: " + errorBuffer.toString("UTF-8"));

channel.disconnect();</code>

Dalam contoh ini, gelung while membaca aliran keluaran (dalam dan err) secara berterusan sambil memantau status arahan (channel.isClosed()). Ini memastikan semua output ditangkap, walaupun arahan itu menghasilkan sejumlah besar data.

Atas ialah kandungan terperinci Mengapa arahan JSch saya tergantung semasa membaca output?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn