crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QProcess+запуск приложения через ssh+QTcpSocket
Lenymo
  опции профиля:
сообщение 20.7.2010, 21:39
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 16.6.2010
Пользователь №: 1812

Спасибо сказали: 1 раз(а)




Репутация:   0  


В главном потоке запускается удаленное приложение через ssh

...
QProcess *process = new QProcess;
process->start("ssh -T -i ~/.ssh/id_rsa_user user@remote-host ./remoteApp");
if (process->waitForStarted())
    emit newConnection("remote-host", 5000);
...


Дочерний поток по этому newConnection() коннектится к remoteApp
...
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost(hostName, port);
if(socket->waitForConnected())
    qDebug() << "Failed to connect" << endl;
...


Однако, коннекта не происходит, приходит ошибка сокета "Connection refused", то есть приложение еще не запустилось. Видимо, waitForStarted() срабатывает на старт самого ssh. Вопрос - можно ли как-то отследить запуск собственно remoteApp? И еще - если запускать приложение из консоли, то оно стартует мгновенно, откуда задержка при запуске из программы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.7.2010, 1:27
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Я думаю ни какой задержки запуска приложения нет. Потому-что process->waitForStarted() вернёт управление сразу, как только начнёт выполнятся соответствующая команда.

Если хочется большей уверенности, можно попытаться ловит стандартный вывод команды, если она его осуществляет при успешном запуске.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lenymo
  опции профиля:
сообщение 21.7.2010, 4:02
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 16.6.2010
Пользователь №: 1812

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата
process->waitForStarted() вернёт управление сразу, как только начнёт выполнятся соответствующая команда

Соответствующая чему? Если возврат из этой фукнции означает запуск удаленного приложения, почему тогда не получается к нему приконнектиться по TCP? А если после возврата из waitForStarted() поставить sleep(10), то коннект происходит успешно...

Цитата
Если хочется большей уверенности, можно попытаться ловит стандартный вывод команды

Сейчас так и делаю, но имхо это не есть удачное решение, хотелось бы обойтись waitForStarted(). К тому же, в случае локального, а не удаленного, запуска, все срабатывает на ура.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.7.2010, 7:11
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Lenymo @ 21.7.2010, 8:02) *
Соответствующая чему?
ssh -T -i ~/.ssh/id_rsa_user user@remote-host ./remoteApp
т.е. набрав это в командной строке и нажав ввод, как только в командной строке, что-то изменится, например появится приглашение ил что-то ещё. То это означает что команда выполнилась или запустилась, этому же соответствует возврат из функции waitForStarted()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 21.7.2010, 9:23
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


Цитата(Lenymo @ 21.7.2010, 4:02) *
Сейчас так и делаю, но имхо это не есть удачное решение, хотелось бы обойтись waitForStarted(). К тому же, в случае локального, а не удаленного, запуска, все срабатывает на ура.

я бы делал по другому:
...
QTcpSocket *socket = new QTcpSocket;
while(true) {
socket->connectToHost(hostName, port);
if(socket->waitForConnected())
    qDebug() << "Failed to connect" << endl;
    sleep(10);
}
...

вместо while(true), можно подставить счетчик и в результате, если ошибка, написать что то типа: Connection failed after 5 retries...
Помоему это более корректно чем считывать с консоли какой то левак :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lenymo
  опции профиля:
сообщение 21.7.2010, 15:51
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 16.6.2010
Пользователь №: 1812

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 21.7.2010, 10:11) *
То это означает что команда выполнилась или запустилась, этому же соответствует возврат из функции waitForStarted()


Привожу лог программы с моими комментариями:

Раскрывающийся текст
/* Запускаются в главном потоке последовательно два процесса - локальный и удаленный с одной и той же командой. После возврата из waitForStarted() выводится*/
Process started "remote-host"
Process started "localhost"

/*Далее в дочернем потоке так же последовательно по newConnection() пытаемся законнектиться к запущенным приложениям*/
Create new connection "remote-host" 5000
Failed to connect to host "remote-host" port 5000
socket error: "Connection refused"

Create new connection "localhost" 6025
Socket connected to host "localhost" port 6025

QProcess(0x80f5218, name = "localhost") "ready for connect on port 6025.
connect from host 127.0.0.1, port 38991."
QProcess(0x80f5218, name = "localhost") "main thread started..."

QProcess(0x8146878, name = "remote-host") "ready for connect on port 5000."


Как видно из лога, несмотря на якобы запустившееся удаленное приложение, коннект к нему не происходит, да и его stdout приходит заметно позже аналогичного от локального приложения. В чем тут может быть проблема? :huh:
Причина редактирования: заменил spoiler на expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.7.2010, 15:55
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Lenymo @ 21.7.2010, 19:51) *
да и его stdout приходит заметно позже аналогичного от локального приложения
ну это совершенно нормально.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lenymo
  опции профиля:
сообщение 21.7.2010, 16:28
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 16.6.2010
Пользователь №: 1812

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 21.7.2010, 18:55) *
Цитата(Lenymo @ 21.7.2010, 19:51) *
да и его stdout приходит заметно позже аналогичного от локального приложения
ну это совершенно нормально.

Как это может быть нормально, если приложение запустилось раньше локального? И раз оно запущено, почему не происходит коннект?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.7.2010, 18:14
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Lenymo @ 21.7.2010, 20:28) *
приходит заметно позже аналогичного от локального приложения
Цитата(Lenymo @ 21.7.2010, 20:28) *
запустилось раньше локального
чёт я тебя не пойму. Так всётаки удалённое запускается раньше или позже локального
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lenymo
  опции профиля:
сообщение 21.7.2010, 20:41
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 16.6.2010
Пользователь №: 1812

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 21.7.2010, 21:14) *
Цитата(Lenymo @ 21.7.2010, 20:28) *
приходит заметно позже аналогичного от локального приложения
Цитата(Lenymo @ 21.7.2010, 20:28) *
запустилось раньше локального
чёт я тебя не пойму. Так всётаки удалённое запускается раньше или позже локального


Если верить логам, то раньше - они в цикле запускаются, при этом следующая итерация начинается только по выходу из waitForStarted() предыдущей:

Process started "remote-host"
Process started "localhost"

Однако, попытка установить TCP-соединение с удаленным приложением заканчивается неудачей. Далее, опять же по логам, видно, что сначала мы получаем stdout локальный, а затем только удаленный, который, ессно, уже запоздал:

QProcess(0x80f5218, name = "localhost") "ready for connect on port 6025.
connect from host 127.0.0.1, port 38991."
QProcess(0x80f5218, name = "localhost") "main thread started..."

QProcess(0x8146878, name = "remote-host") "ready for connect on port 5000."
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.1.2025, 17:06