【问题标题】:How to terminate a process如何终止进程
【发布时间】:2010-11-26 05:12:18
【问题描述】:

我正在一个 PHP 脚本中使用 proc_open 创建一个进程。

我如何在另一个脚本中终止它。我无法传递 proc_open 返回的资源。

我也尝试使用 proc_get_status() ,它返回 ppid 。我没有得到孩子们的pid。

开发环境:WAMP

感谢任何输入。

【问题讨论】:

  • 我猜:没有处理任何进程信息是没有办法的。
  • @tuergeist 或多或少,这是真的。在 unix-likes 上,可以在打开该进程时立即打开该进程的管道,这样您就可以告诉它稍后关闭,但是在 PHP 这样的无状态系统上,除非您使用 session 或相似的东西。最后,你必须跟踪一些东西,这样你才能知道如何关闭 proc。
  • 有更新就好了。
  • 我决定更改我的模型并终止同一脚本上的进程。但是仍然有人可以提供一些输入。

标签: php kill-process


【解决方案1】:

我建议您重新检查您的模型,以确保您实际上必须从其他地方终止该进程。除了最微不足道的情况外,您的代码将越来越难以调试和维护。

为了保持封装状态,您可以向您希望终止的进程发出信号,并在您希望终止的进程中正常退出。否则,您可以使用普通 IPC 发送一条消息:“嘿,伙计。请关闭。”

编辑:对于第二段,您最终可能仍会启动一个脚本来执行此操作。没关系。您要避免的是 kill -9 类型的事情。相反,让进程优雅地退出。

【讨论】:

  • 问题是我有一个带有开始和停止按钮的 html 页面。开始进入一个名为“start.php”的脚本,它在其中创建一个新进程。停止按钮需要停止/终止进程。我该怎么做呢 ?据我所知,停止功能需要用单独的脚本编写吗?
  • 我不这么认为。你有分裂。您可以访问 cookie。您可以访问可以写入文件等的文件系统(实际上,最后一个您可能没有,具体取决于安全设置)。您可以保存跨接进程的 pid 并在以后调用它并使用我上面提到的技术。对不起,我不能给你确切的语法;我自己一直在寻找这类东西。
  • 其实,如果除了几个小的php脚本之外都是静态的html,scession可能是不可能的。
  • 废话......这是“会话”而不是“分裂”。原谅我。
【解决方案2】:

要在纯 PHP 中做到这一点,解决方案如下:

posix_kill($pid, 15); // SIGTERM = 15

【讨论】:

    【解决方案3】:

    你可以使用一些方法来创建进程,这个方法通常返回新进程的PID。

    这对你有用吗? :

    $process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
    $return_value = proc_close($process);
    

    【讨论】:

    • $process 这里是资源而不是 pid。我不能/不能将此传递给另一个脚本来终止它。
    • 有$process.pid,你可以使用它。您可以将其写入文件(效率不高)或通过网络发送到其他进程(“脚本”)。
    • $process.pid 返回“资源 id #6pid”。我该怎么办?
    【解决方案4】:

    你最好使用这样的东西来启动你的其他进程:

    $pid = shell_exec("nohup $Command > /dev/null 2>&1 & echo $!");
    

    那里会执行该进程,并给你一个正在运行的进程ID。

    exec("ps $pid", $pState);     
    $running = (count($pState) >= 2);    
    

    终止你总是可以使用

    exec("kill $pid");
    

    但是,您不能杀死不属于 PHP 运行的用户所拥有的进程 - 如果它以无人身份运行 - 您将以无人身份启动新进程,并且只能杀死在用户 nobody 下运行的进程。

    【讨论】:

    • 不,我需要使用 proc_open,因为我需要在一个实例中发送大量命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2011-01-04
    相关资源
    最近更新 更多