Вызвать скрипт внешней оболочки из PHP и отправить в него входные данные - PullRequest
1 голос
/ 08 мая 2009

Моя цель - вызвать сценарий оболочки из PHP-программы, а затем подождать несколько секунд, чтобы отправить ему какой-нибудь ключ завершения (я не могу просто убить его, потому что хочу проверить правильность выполнения фазы завершения) .

Вот пример того, что я хотел бы иметь:

system( "RUNMYSCRIPT.sh" );  // Launch the script and return immediately.
sleep( 10 );                 // Wait.
exec( "q" );                 // Send a termination key to the previous script? 

Ответы [ 2 ]

3 голосов
/ 08 мая 2009

Вам необходимо использовать proc_open () , чтобы иметь возможность общаться с вашим процессом. Ваш пример будет работать так:

// How to connect to the process
$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w")
);

// Create connection
$process = proc_open("RUNMYSCRIPT.sh", $descriptorspec, $pipes);
if (!is_resource($process)) {
    die ('Could not execute RUNMYSCRIPT');
}

// Sleep & send something to it:
sleep(10);
fwrite($pipes[0], 'q');

// You can read the output through the handle $pipes[1].
// Reading 1 byte looks like this:
$result = fread($pipes[1], 1);

// Close the connection to the process
// This most likely causes the process to stop, depending on its signal handlers
proc_close($process);
0 голосов
/ 08 мая 2009

Вы не можете просто отправить ключевое событие в такое внешнее приложение. Можно записать в stdin сценария внешней оболочки, используя proc_open () вместо system (), но большинство сценариев оболочки прослушивают нажатия клавиш напрямую, а не наблюдают за stdin.

Вместо этого вы можете использовать сигналы. Практически все приложения оболочки реагируют на такие сигналы, как SIGTERM и SIGHUP. Можно также отлавливать и обрабатывать эти сигналы, используя сценарии оболочки. Если вы используете proc_open () для запуска сценария оболочки, то вы можете использовать proc_terminate () для отправки сигнала SIGTERM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...