从浏览器运行时posix_kill无法正常工作

时间:2012-06-23 07:06:43

标签: php apache process kill-process sigkill

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

<?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 =&gt;字符串''(长度= 0)           1 =&gt;字符串'4633'(长度= 4)           2 =&gt;字符串''(长度= 0)         杀死4633

我检查了apache“error.log”文件,发现对于我从浏览器执行的每次运行,并添加了如下附加条目: [星期六六月23 12:24:55 2012] [错误] [客户端127.0.0.1]文件不存在:/var/www/favicon.ico

不幸的是,这个错误并没有给我很多关于出了什么问题的信息。我检查了php.ini设置,似乎没有任何错误(根据我的有限理解)。我没有在“disabled_functions”列表中看到posix_kill等,或者任何其他设置都不能阻止我执行进程。

真诚地感谢一些帮助!!

谢谢, 卡皮尔

1 个答案:

答案 0 :(得分:3)

错误消息与您的问题无关。只是浏览器询问您尚未配置的网站图标。

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

您可能希望在发送信号之前使用带有sudo的有限exec,或以其他方式承担权限。或者您可以让进程监听Web服务器执行某些操作,然后终止本身。或者,更好的是,不要使用像PHP这样的网络服务语言进行系统管理类型的任务:使用cron或更合适的工具。