我有一个简单的脚本,试图杀死已经运行的进程。我正在使用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等,或者任何其他设置都不能阻止我执行进程。
真诚地感谢一些帮助!!
谢谢, 卡皮尔
答案 0 :(得分:3)
错误消息与您的问题无关。只是浏览器询问您尚未配置的网站图标。
现在,关于实际问题:apache用户可能没有权限来终止你的进程。如果进程是在其他用户帐户下启动的,则无法从Web服务器中删除它。想象一个多用户系统,任何本地用户都可以登录并杀死其他人的进程 - 这不是Unix权限模型......
您可能希望在发送信号之前使用带有sudo
的有限exec
,或以其他方式承担权限。或者您可以让进程监听Web服务器执行某些操作,然后终止本身。或者,更好的是,不要使用像PHP这样的网络服务语言进行系统管理类型的任务:使用cron
或更合适的工具。