моя цель – вызвать скрипт оболочки из программы PHP, а затем подождать несколько секунд, чтобы отправить ему ключ терминации (я не могу просто убить его, потому что хочу проверить правильное выполнение фазы завершения).
Вот пример того, что я хотел бы иметь:
system( "RUNMYSCRIPT.sh" ); // Launch the script and return immediately. sleep( 10 ); // Wait. exec( "q" ); // Send a termination key to the previous script?
Вы должны использовать 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);
Вы не можете просто отправить ключевое событие в такое внешнее приложение. Можно написать в stdin внешнего скрипта оболочки, используя proc_open () вместо system (), но большинство сценариев оболочки прослушивают нажатия клавиш непосредственно, а не смотрят stdin.
Вместо этого вы можете использовать сигналы использования. Практически все приложения оболочки реагируют на сигналы типа SIGTERM и SIGHUP. Можно также захватить и обработать эти сигналы, используя сценарии оболочки. Если вы используете proc_open (), чтобы запустить скрипт оболочки, вы можете использовать proc_terminate () для отправки сигнала SIGTERM.