【问题标题】:How to send signal SIGUSR1 to daemon from Apache PHP script (Ubuntu 14.04)如何从 Apache PHP 脚本(Ubuntu 14.04)向守护进程发送信号 SIGUSR1
【发布时间】:2017-06-13 22:50:54
【问题描述】:

我以为这会很简单,但显然不是。

我有一个守护进程(目前正在作为普通可执行文件进行测试),我需要控制它在网页上的作用。位于中间的是一个 MySQL 数据库,其中包含双向传递的所有必要数据。都在同一台机器上。

当从网页发出命令时,PHP 将适当的数据放入数据库,守护进程读取并执行操作。到目前为止,一切顺利。

但是,守护进程轮询数据库,因此存在时间滞后。我想要做的是向守护进程发送一条消息,说“现在看”。所以我想我会向它发送一个信号 - SIGUSR1。

当信号是从命令行发送时(kill -SIGUSR1 ....),但不是从 PHP - system("kill -SIGUSR1 ....") 发送信号时,这绝对可以正常工作。

所以我想 - 内部 shell 命令,所以将 kill 命令放在 shell 脚本中。同样,从命令行运行时可以正常工作,但不能从 Apache PHP system() API 运行。

使用 PHP posix_kill() 尝试了同样的事情,但也失败了。

似乎是权限问题。 Apache 脚本用户无权发出 kill 命令。所以我想,好吧 - 无论如何只是为了测试 - SUID 脚本。您不能 SUID 脚本,否则它会出现。

因此,在 system() 调用中对脚本进行 sudo 处理,将脚本和用户 (www-data) 添加到 /etc/sudoers.d,这样就不会出现 sudo 密码提示。脚本中的 kill 或 pkill 命令仍然返回代码 1(权限被拒绝) - 但它以 root 身份运行。

所以我被困住了。这似乎是一件简单的事情 - 向守护进程发送一个信号说“醒来”。但是,我找不到这样做的方法。

【问题讨论】:

    标签: php linux apache signals daemon


    【解决方案1】:

    好吧,很奇怪,在重新启动并且没有其他更改之后,sudo 方法突然起作用了。总结:

    1. 创建包含 (pkill) 命令的脚本
    2. 放入 /usr/local/bin 并使其可执行
    3. 为此命令将 www-data 添加到 sudoers(/etc/sudoers.d 中的新文件)
    4. 从 PHP Apache 脚本作为系统调用(“sudo /usr/local/bin/script_name”)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多