【问题标题】:How to get pid of the process that run in background exec by shell in php如何通过php中的shell获取在后台exec中运行的进程的pid
【发布时间】:2014-03-31 15:48:06
【问题描述】:

我正在用 php 编写一个 shell,我想显示与 bash 相同的输出。在 bash 中执行 sleep 10 & 时,您将得到 [1] <PID>。当我使用以下方式调用 shell 时,如何在 php 中执行相同操作:

    if (preg_match("/&\s*$/", $command)) {
        $this->$shell_fn($token, '/bin/bash -c ' . escapeshellarg($command) .
                         " > /dev/null");
        return array(
            'output' => '',
            'cwd' => $path
        );
    }

$shell_fn 是指向 curl 调用的 shell_exec、exec 或 cgi 脚本的包装器的变量。是否有可能从 php 或使用 shell 获取 pid?

【问题讨论】:

    标签: php linux bash shell


    【解决方案1】:

    如果您想要 中的 pid,您可以使用 ! special parameter 获取最近后台进程的 pid:

    bash -c 'sleep 10 & echo $!'
    

    我不知道 是如何产生外部进程的,但我想你可以在这里捕获echo 的输出,只需运行上面的shell 命令。

    【讨论】:

    • 本作品:echo shell_exec("/bin/bash -c 'sleep 5 > /dev/null & echo $!'");
    • 你知道如何获取[1] 号码吗?
    • 这是作业编号。您可以使用jobs 命令来获取它。在你的情况下是这样的:/bin/bash -c 'sleep 5 > /dev/null & jobs -l | grep $!'
    • 或者更准确地说是/bin/bash -c 'sleep 5 > /dev/null & jobs -l | grep -w $!',即将-w传递给grep。
    【解决方案2】:

    我使用这个函数来管理进程:

    function ProcessStart($cmdline) // return pid
    {
        exec( "nohup $cmdline >/dev/null 2>&1 & echo $!", $output) ;
        // print_r ($output);
        return (int)$output[0];
    }
    
    function ProcessStatus($pid) // return TRUE (live) o FALSE (dead)
    {
        exec("ps -p $pid",$output);
        // print_r($output);
        return ( isset($output[1]) ? TRUE : FALSE ) ;
    }
    
    function ProcessStop($pid)
    {
        exec("kill $pid",$output); // kill -9 ??
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2017-01-23
      • 2022-06-29
      • 2017-04-04
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多