В моем довольно большом проекте помимо прочего я использую команду Run.
Я использую ее в основном для 2 целей:
1. Запуск удаленных команд на роутере
2. Отправка логов на удаленный сервер
Проблема заключается в том, что иногда в выводе конкретного Run запуска удаленной команды оказывается результат выполнения удаленной команды сервера.
Приведу проблемный код целиком:
Вот таким образом я аккуратно, с обработкой всех ошибок выполняю удаленную команду и читаю результат:
А вот таким образом отправляю логи на удаленный сервер:
Вроде бы, все переменные уникальны, объявлены как Local, т.е. пересечений быть не может.
Но почему-то иногда после выполнения удаленной команды сервера, в sPlinkOutputStd и sPlinkOutputErr оказываются данные, прочитанные при выполнении cmdCurlLog.
Почему? StdoutRead и StderrRead каким-то образом перехватывают вывод чужой программы? Хотя параметры для них я задаю явно как iPidPlink.
Единственное, что приходит в голову, что каким-то образом Run из curlSendLog еще не завершился, а Run для выполнения plink уже запускается, но ведь я явно указываю, из какого процесса читать stdout и stderr?
Я использую ее в основном для 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?