0

我有一个简单的脚本,它试图杀死一个已经在运行的进程。我也在使用 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);
            }
    }

    }
?>

我总是得到以下输出,这意味着脚本执行得很好,但进程没有被杀死: process id -- 4632 array (size=3) 0 => string '' (length=0) 1 => string '4633' (length=4) 2 => string '' (length=0) Killing 4633

我检查了 apache“error.log”文件,发现对于我从浏览器执行的每次运行,附加条目添加如下:[Sat Jun 23 12:24:55 2012] [error] [client 127.0. 0.1] 文件不存在:/var/www/favicon.ico

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

真诚地感谢一些帮助!

谢谢,卡皮尔

4

1 回答 1

3

错误信息与您的问题无关。这只是浏览器要求您提供您尚未配置的站点图标。

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

您可能希望在发送信号之前使用受限sudo的 withexec或以其他方式获得权限。或者你可以让进程监听网络服务器做某事,然后杀死自己。或者,更好的是,不要将 PHP 之类的 Web 服务语言用于系统管理类型的任务:使用cron或更合适的工具。

于 2012-06-23T07:31:44.603 回答