QProcess+запуск приложения через ssh+QTcpSocket |
Здравствуйте, гость ( Вход | Регистрация )
QProcess+запуск приложения через ssh+QTcpSocket |
Lenymo |
20.7.2010, 21:39
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 16.6.2010 Пользователь №: 1812 Спасибо сказали: 1 раз(а) Репутация: 0 |
В главном потоке запускается удаленное приложение через ssh
Дочерний поток по этому newConnection() коннектится к remoteApp
Однако, коннекта не происходит, приходит ошибка сокета "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 |
Соответствующая чему? 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 |
Сейчас так и делаю, но имхо это не есть удачное решение, хотелось бы обойтись waitForStarted(). К тому же, в случае локального, а не удаленного, запуска, все срабатывает на ура. я бы делал по другому:
вместо while(true), можно подставить счетчик и в результате, если ошибка, написать что то типа: Connection failed after 5 retries... Помоему это более корректно чем считывать с консоли какой то левак |
|
|
Lenymo |
21.7.2010, 15:51
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 16.6.2010 Пользователь №: 1812 Спасибо сказали: 1 раз(а) Репутация: 0 |
То это означает что команда выполнилась или запустилась, этому же соответствует возврат из функции 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 приходит заметно позже аналогичного от локального приложения. В чем тут может быть проблема?
Причина редактирования: заменил spoiler на expand
|
|
|
Litkevich Yuriy |
21.7.2010, 15:55
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Lenymo |
21.7.2010, 16:28
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 16.6.2010 Пользователь №: 1812 Спасибо сказали: 1 раз(а) Репутация: 0 |
да и его stdout приходит заметно позже аналогичного от локального приложения ну это совершенно нормально.Как это может быть нормально, если приложение запустилось раньше локального? И раз оно запущено, почему не происходит коннект? |
|
|
Litkevich Yuriy |
21.7.2010, 18:14
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Lenymo |
21.7.2010, 20:41
Сообщение
#10
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 16.6.2010 Пользователь №: 1812 Спасибо сказали: 1 раз(а) Репутация: 0 |
приходит заметно позже аналогичного от локального приложения запустилось раньше локального чёт я тебя не пойму. Так всётаки удалённое запускается раньше или позже локальногоЕсли верить логам, то раньше - они в цикле запускаются, при этом следующая итерация начинается только по выходу из 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." |
|
|
Текстовая версия | Сейчас: 14.1.2025, 17:06 |