【问题标题】:Invoke external shell script from PHP and send some input to it从 PHP 调用外部 shell 脚本并向其发送一些输入
【发布时间】:2009-05-08 08:49:06
【问题描述】:

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

这是我想要的示例:

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

【问题讨论】:

    标签: php shell


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不能简单地将按键事件发送到这样的外部应用程序。可以通过使用proc_open() 而不是 system() 来写入外部 shell 脚本的标准输入,但大多数 shell 脚本直接侦听击键而不是观看标准输入。

      您可以做的是使用信号。几乎所有的 shell 应用程序都会响应 SIGTERM 和 SIGHUP 等信号。也可以使用 shell 脚本来捕获和处理这些信号。如果你使用 proc_open() 来启动你的 shell 脚本,那么你可以使用proc_terminate() 来发送一个 SIGTERM 信号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多