【问题标题】:Sending signal to daemon in php在php中向守护进程发送信号
【发布时间】:2010-04-12 14:07:16
【问题描述】:

我有一个用 PHP 编写的守护进程,它在我的 linux 机器上运行。

我正在尝试通过另一个 php 文件向它发送信号。 为此,我正在尝试 posix_kill 函数。但它不起作用。

当我运行php页面时,我得到一个错误,php是在没有--enable-grep的情况下编译的

我想知道如何启用它?或者向守护进程发送信号的替代方式是什么?

【问题讨论】:

    标签: php daemon


    【解决方案1】:

    在 PHP 脚本上处理信号的唯一方法是使用 PCNTL 库重新编译 PHP,该库将为您提供所需的工具/功能。

    http://php.net/manual/en/book.pcntl.php

    否则,您需要使用诸如Quamis mentioned 之类的变通方法:文件标志或锁定等。

    【讨论】:

      【解决方案2】:

      如果你知道进程的 ID,你就可以

      exec( "kill -SIGKILL 1234", $return );
      print_r( $return );
      

      或者如果你不知道进程 ID

      exec( "pkill -KILL myDaemon", $r );
      print_r( $return );
      

      要查找all the available signals,您可以发送:

      shell> kill -l
      

      如果遇到问题,请将stderr 重定向到标准输出:

      exec( "pkill -KILL myDaemon 2>&1", $r );
      print_r( $return );
      

      这将向您显示任何可能出现在终端上的错误消息(如果您一直以这种方式执行命令!)。

      【讨论】:

      • 我知道进程 ID。但是调用 exec("kill -SIGKILL 1234", $return );从 PHP 不返回任何内容。当我可以从 linux 提示符下执行相同的命令时,它工作正常。可能出了什么问题?
      • 运行php的用户必须是进程的所有者。尝试使用exec() 的第三个参数来检查错误的返回码php.net/manual/en/function.exec.php
      • 不,进程的所有者是 root。当我调用 exec("kill -SIGKILL $PID", $return, $out); $return 显示空白数组。 $out 显示 1
      • 1 表示失败。 steve-parker.org/sh/exitcodes.shtml我将更新我的答案,以便您可以通过重定向 stderr 从脚本中获取错误消息
      • 但是如何通过php将信号传递给root拥有的进程?这就是我需要的。有什么想法吗?
      【解决方案3】:

      尝试使用共享内存、锁或文件。如果进程属于不同的用户,则在进程之间发送信号可能不起作用。

      如果您需要扩展,例如使用文件或锁可能会对您有所帮助,因为它比使用信号更容易复制。

      像我所说的信号问题是守护程序必须定期查找事件...通过使用信号,守护程序中的某个触发器会立即被调用,如果您需要快速响应,这会让生活变得更轻松.

      【讨论】:

      • 对不起,你也得花点功夫,我不会简单地给出代码...
      猜你喜欢
      • 2015-06-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多