ЗАПУСТИТЬ процесс в фоновом режиме в WINDOWS

У меня проблема с запуском команды из сценария PHP. Команда, которую я пытаюсь запустить,

echo y | plink -ssh -N -D 9999 [email protected] -pw admin -v

Дело в том, что команда запускается, но скрипт зависает до выполнения команды plink, чего я не хочу. Я также пробовал (работает в фоновом режиме) это:

START /MIN "cmd.exe" /C "plink -ssh -N -D 9999 [email protected] -pw admin"

и я вижу, что свернутый plink работает, и как только я его закрываю, сценарий продолжается.

Я также пробовал:

START /B /MIN "cmd.exe" /C "plink -ssh -N -D 9999 [email protected] -pw admin"

и он делает то же самое, но показывает вывод в скрипте PHP.

это функция:

function create_tunnel($ip,$user,$pass,$port)
{
    exec('START /min cmd /c "echo y | plink -ssh -N -D '.$port.' '.$user.'@'.$ip.' -pw '.$pass.' -v" > nul');
}

Что я должен сделать, чтобы запустить эту команду и позволить PHP-скрипту продолжить выполнение? В Linux это было бы очень просто, я бы просто использовал команду screen.

Спасибо.


person Damian    schedule 29.09.2015    source источник
comment
Вы пробовали START /B?   -  person Panama Jack    schedule 30.09.2015
comment
Вы проверили, нет ли призрачного процесса plink?   -  person Paul    schedule 30.09.2015
comment
@PanamaJack да, просто введите команду и подождите ... Пол нет, призрачного процесса нет   -  person Damian    schedule 30.09.2015
comment
Я так понимаю, вы хотите, чтобы пакетный скрипт выполнялся, а php-скрипт продолжал свою работу? php-скрипт ждут plink? А может все наоборот?   -  person Paul    schedule 30.09.2015
comment
Вы пробовали START "" /MIN "cmd.exe /C plink -ssh -N -D 9999 [email protected] -pw admin" (также с /B)?   -  person aschipfl    schedule 30.09.2015
comment
да, все еще жду...   -  person Damian    schedule 30.09.2015
comment
возможный дубликат Запуск PHP exec() в фоновом режиме в Windows ?   -  person Harry Johnston    schedule 30.09.2015


Ответы (1)


Попробуйте компонент Symfony Process:

$process = new Process('ls -lsa');
$process->start();

while ($process->isRunning()) {
    // waiting for process to finish
}

echo $process->getOutput();
person ankhzet    schedule 29.09.2015
comment
Мне нужно включить специальный класс или что-то в этом роде? или это в библиотеках PHP? также я использую WINDOWS, если бы я был в LINUX, я бы просто использовал экран - person Damian; 30.09.2015
comment
Это крошечная отдельная часть известного PHP-фреймворка Symfony. Очевидно, что это кроссплатформенный продукт, и он хорошо протестирован. Вы можете установить его через Composer или загрузить из официального репозитория, затем включить vendor/autoload.php файл в свой скрипт, и он будет готов к использованию. - person ankhzet; 30.09.2015
comment
Кроме того, вы можете заглянуть в его реализацию, чтобы узнать подробности выполнения асинхронной команды. Там используется popen функция php вместо exec, на самом деле. - person ankhzet; 30.09.2015
comment
pclose(popen('START /b /min cmd /c "echo y | plink -ssh -N -D '.$port.' '.$user.'@'.$ip.' -pw '.$pass.' -v" > nul',"r")); ??? это?? вроде работает... не знаю почему... - person Damian; 30.09.2015
comment
popen просто открывает запущенный дескриптор процесса. exec также ожидает вывода процесса, поэтому он блокирует скрипт до тех пор, пока запущенный процесс не завершится. чтобы получить вывод выполненного процесса при использовании popen, вы должны просто прочитать его как из обычного файла с fread вручную. Таким образом, exec внутри использует popen, а затем ожидает вывода. - person ankhzet; 30.09.2015