从PHP调用外部shell脚本并向其发送一些输入

时间:2009-05-08 08:49:07

标签: php shell

我的目标是从PHP程序调用一个shell脚本,然后等待几秒钟向它发送一些终止键(我不能简单地杀死它,因为我想测试终止阶段的正确执行)

以下是我想要的例子:

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

2 个答案:

答案 0 :(得分:3)

您需要使用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);

答案 1 :(得分:0)

您不能简单地将密钥事件发送到此类外部应用程序。可以使用proc_open()而不是system()来写入外部shell脚本的stdin,但大多数shell脚本直接监听击键而不是监视stdin。

你可以做的是使用信号。实际上,所有shell应用程序都会响应SIGTERM和SIGHUP等信号。使用shell脚本也可以捕获和处理这些信号。如果使用proc_open()启动shell脚本,则可以使用proc_terminate()发送SIGTERM信号。