Что нового

[Процессы] Некорректный вывод после выполнения Run (иногда)

iltmpz

Новичок
Сообщения
23
Репутация
0
В моем довольно большом проекте помимо прочего я использую команду Run.
Я использую ее в основном для 2 целей:
1. Запуск удаленных команд на роутере
2. Отправка логов на удаленный сервер
Проблема заключается в том, что иногда в выводе конкретного Run запуска удаленной команды оказывается результат выполнения удаленной команды сервера.

Приведу проблемный код целиком:
Вот таким образом я аккуратно, с обработкой всех ошибок выполняю удаленную команду и читаю результат:
Код:
Local $cmd=@ComSpec & " /c " & $proxyDataDir & "\plink.exe -auto_store_key_in_cache -batch -ssh -l "&$sRouterLogin&" -pw "&$sRouterPassword&" "&$sRouterIp&"   "&$sServerCmd
	LogDbg("plinkCommandExecuteOnRouter: "&$cmd)
	Local $iPidPlink= Run($cmd, "",@SW_HIDE,$STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)
	Local $isProcessFinished=False
	For $i=0 To 180
		If Not ProcessExists($iPidPlink) Then
			$isProcessFinished=True
			ExitLoop
		EndIf
		LogDbg2("ProcessExists, waiting "&$i)
		Sleep (1000)
	Next
	Local $sPlinkOutputStd = StdoutRead($iPidPlink)
	Local $sPlinkOutputErr = StderrRead($iPidPlink)
	ProcessClose ( $iPidPlink )


А вот таким образом отправляю логи на удаленный сервер:
Код:
Func curlSendLog($url)
	Local $sSuffix=''
	Local $curlDir=$dataDir & "\curl"
	Local $cmdCurlLog=@ComSpec & " /c " & $curlDir & '\curl.exe -u юзер:пасс --connect-timeout 4 "'&$url&$sSuffix&'"'
	Local $iPidCurlLog= Run($cmdCurlLog, "",@SW_HIDE,$STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)
	If @error Then
		Return SetError(1,0,1)
	EndIf
	Return 0
EndFunc


Вроде бы, все переменные уникальны, объявлены как Local, т.е. пересечений быть не может.
Но почему-то иногда после выполнения удаленной команды сервера, в sPlinkOutputStd и sPlinkOutputErr оказываются данные, прочитанные при выполнении cmdCurlLog.
Почему? StdoutRead и StderrRead каким-то образом перехватывают вывод чужой программы? Хотя параметры для них я задаю явно как iPidPlink.
Единственное, что приходит в голову, что каким-то образом Run из curlSendLog еще не завершился, а Run для выполнения plink уже запускается, но ведь я явно указываю, из какого процесса читать stdout и stderr?
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
$iPidCurlLog= Run ты поток к себе завернул, но не прочитал его. Он не исчезает сам по себе,он ждёт пока его прочитают.
 
Автор
I

iltmpz

Новичок
Сообщения
23
Репутация
0
Кстати да, забыл про ProcessClose ( $iPidCurlLog ), добавил.

Значит, надо обязательно его читать через StdoutRead и StderrRead чтобы проблем не было?
Я сейчас убрал 3-й параметр: $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD, все равно в команде логирования они мне не нужны. Теперь при чтении выходных данных первой функции - StdoutRead($iPidPlink) - пустые строки.
А надо, чтобы каждый раз при вызове $iPidPlink= Run($cmd... - получать строки с результатом...
 
Верх