从浏览器运行时posix_kill不起作用


posix_kill not working when run from browser

我有一个简单的脚本,它试图杀死一个已经在运行的进程。我正在使用posix_kill。如果我从命令外壳运行它,该脚本运行良好,但当我从浏览器运行它时不起作用。

<?php
    $taskid  = 33;
    killProcess($taskid);
    function killProcess($taskid) {
    $ppid = getPID($taskid);
    echo "process id -- $ppid'n";
    $pids = preg_split('/'s+/', `ps -o pid --no-heading --ppid $ppid`);
    var_dump($pids);
    foreach($pids as $pid) {
            if(is_numeric($pid)) {
            echo "Killing $pid'n";
                posix_kill($pid, 15);
            }
    }
    }
?>

我总是得到以下输出,这意味着脚本执行正常,但进程没有被杀死: 进程 ID -- 4632 数组(大小 = 3) 0 =>字符串 '' (长度 = 0) 1 => 字符串 '4633'(长度 = 4) 2 =>字符串 '' (长度 = 0) 杀戮 4633

我检查了 apache"error.log"文件,发现对于我从浏览器进行的每次运行,都会添加其他条目,如下所示:[2012年6月23日星期六 12:24:55][错误][客户端 127.0.0.1]文件不存在:/var/www/favicon.ico

不幸的是,此错误没有给我太多关于出了什么问题的信息。我检查了 php.ini 设置,似乎没有任何错误(根据我有限的理解)。我在"disabled_functions"列表中看不到posix_kill,也没有看到任何其他应该阻止我执行进程的设置。

将真诚地感谢一些帮助!

谢谢卡皮尔

错误消息与您的

问题无关。这只是浏览器询问您尚未配置的网站图标。

现在,关于实际问题:apache用户可能没有权限终止您的进程。如果进程是在不同的用户帐户下启动的,则无法从 Web 服务器中终止它。想象一个多用户系统,任何本地用户都可以登录并杀死其他人的进程 - 这不是Unix权限模型......

您可能希望在发送信号之前将受限sudoexec 一起使用,或者以其他方式获取权限。或者,您可以让进程侦听 Web 服务器执行某些操作,然后自行终止。或者,更好的是,不要使用像PHP这样的Web服务语言来完成系统管理类型的任务:使用cron或更合适的工具。