Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема с jsch и выполнением unix комманд из java / 8 сообщений из 8, страница 1 из 1
15.01.2015, 11:12
    #38854967
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
Добрый день.

вот есть небольшой участок кода, где я подключаюсь к linux и запускаю выполнение unix-команд:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
StringBuilder stringBuilder = new StringBuilder();

            Channel channel = session.openChannel("shell");

            InputStream in = channel.getInputStream();
            OutputStream out = channel.getOutputStream();

            ((ChannelShell) channel).setPty(true);
            channel.connect();

            byte[] tmp = new byte[1024 * 8];

            out.write((command).getBytes());
            out.write(("\n").getBytes());
            out.write(("exit").getBytes());
            out.write(("\n").getBytes());
            out.flush();


            Thread.sleep(1000);

            while (true) {
                while (in.available() > 0) {

                    int i = in.read(tmp, 0, 1024);
                    if (i < 0) {
                        break;
                    }
                    String buffer = new String(tmp, 0, i);
                    stringBuilder.append(buffer);
                }

                if (channel.isClosed()) {

                    in.close();
                    break;
                }
                //wait some time while script will be executed
                Thread.sleep(1000);
            }


            channel.disconnect();



Не происходит выход из внешнего цикла. Из внешнего цикла мы выходим, когда канал закрыт.

При этом сначала in.available() - возвращает положительные значения, а в какой - то момент 0.

По ответам в гугле не смог понять, почему начинает возвращать 0.

В доке написано, что available() для inputstream - всегда возращает 0.
http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available()

Поправьте, плиз, меня в чем я ошибаюсь, и в этом ли вообще дело, что цикл у меня бесконечным получается, может ещё на что мледует обратить внимание?
...
Рейтинг: 0 / 0
15.01.2015, 11:45
    #38855002
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
mr_virtus,

Эта такая особенность сокетов вообще. Другая сторона может даже закрыть соединение, но ты об этом не узнаешь пока не попробуешь читать или писать. И метод isClosed() тут вообще не помошник.
На сколько я понимаю, самый правильный вариант это привязка к протоколу. То есть определять конец сессии можно по содержимому.
Можно использовать таймаут. Если в течении какого-то времени ничего нового не появилось, значит и не появится.

Если вопрос вообще только в закрытии, то отправляй команду закрытия и сам смело закрывай соединение. Для чего ждать сервер-то?
...
Рейтинг: 0 / 0
15.01.2015, 11:54
    #38855023
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
Blazkowicz,

а как мне команду отправить?

у меня на linux машине выполняются разные команды, shell скрипты запускаются(эти команды я предварительно отправляю из java кода на сервак).

и когда они все выполнятся, я добавляю

Код: java
1.
out.write(("exit").getBytes());



это и закрывает канал в моем случае.

Ещё интересный момент, который я тоже не понимаю.

В доке написано:

http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/Channel.html#getInputStream()

авторpublic InputStream getInputStream()

я написал такую штуку:
Код: java
1.
2.
InputStream in = om.jcraft.jsch.channel.getInputStream();
System.out.println(in.getClass().getName());



и получил
авторcom.jcraft.jsch.Channel$MyPipedInputStream

Это же не InputStream.

Почему так или я неправильно что понимаю?
...
Рейтинг: 0 / 0
15.01.2015, 12:14
    #38855049
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
так про

авторcom.jcraft.jsch.Channel$MyPipedInputStream

понял. MyPipedInputStream - наследник InputStream.

про available так и нет пока :)
...
Рейтинг: 0 / 0
15.01.2015, 12:36
    #38855094
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
mr_virtusпро available так и нет пока :)
JavaDoc прочитай. Вдумчиво.
...
Рейтинг: 0 / 0
15.01.2015, 15:51
    #38855371
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
Blazkowicz,

я вот не пойму.

где мне читать про метод available для MyPipedInputStream?

http://www.docjar.com/docs/api/com/jcraft/jsch/Channel$MyPipedInputStream.html

Как он работает? Или в исходники нужно лезть?

Подскажите, плиз :)
...
Рейтинг: 0 / 0
15.01.2015, 15:54
    #38855375
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
mr_virtus,

Странные у тебя желания

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available() Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream. The next invocation might be the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes.

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not . It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

A subclass' implementation of this method may choose to throw an IOException if this input stream has been closed by invoking the close() method.

The available method for class InputStream always returns 0.

This method should be overridden by subclasses.
...
Рейтинг: 0 / 0
15.01.2015, 16:35
    #38855425
mr_virtus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с jsch и выполнением unix комманд из java
Blazkowicz,

Спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / проблема с jsch и выполнением unix комманд из java / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]