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

Mengapa arahan JSch saya tergantung semasa membaca output?

DDD
Lepaskan: 2024-10-31 00:33:30
asal
829 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan