我有一个简单的脚本,它试图杀死一个已经在运行的进程。我正在使用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权限模型......
您可能希望在发送信号之前将受限sudo
与 exec
一起使用,或者以其他方式获取权限。或者,您可以让进程侦听 Web 服务器执行某些操作,然后自行终止。或者,更好的是,不要使用像PHP这样的Web服务语言来完成系统管理类型的任务:使用cron
或更合适的工具。