使用PHP exec命令执行taskkill

3

我刚刚尝试执行了以下操作:

function kill_hr(){

    exec("taskkill /IM uper.exe", $output = array(), $return);

    print_r($output);

    echo "<br />".$return;

}

然而,输出结果非常不实用:

数组() 1

当进程不存在时,输出为:

数组() 128

我正在努力找出为什么进程存在时它会给我一个1-这是权限问题吗?如果是,我该如何解决?

4个回答

8
感谢大家的帮助 - 我最终使用以下方法成功终止了该进程:
$output = shell_exec('taskkill /F /IM "uper.exe"');

我相信使用exec也可以实现,但重要的是强制使用/F参数! :)


不要使用 " " 标签,在 Win7 x64 上无法正常工作。没有使用标签时,它表现得很好,谢谢! - ArendE

3

我之前也遇到过这个问题,以下是一些解决方法:

解决方案 #1

使用Windows的start命令启动taskkill

exec('start /B taskkill /IM notepad.exe', $output = array(), $return);

解决方案 #2

使用cmd.exe打开一个新的命令行窗口:

exec('cmd /c taskkill /IM notepad.exe', $output = array(), $return);

**注意:我以前都用过这两种方法在PHP中启动后台进程,但我不确定返回值会是什么,所以你需要进行实验。


1
谢谢你的回复和有用的建议:我尝试了两种方法,cmd方案给我带来了与之前相同的结果。但是在启动时它返回了成功 - 让我很兴奋,但我看到它没有杀死进程,但仍然返回了成功。怎么回事?我要怎样才能让它杀死进程!! - Abs
当您使用 start 命令时,会返回 start 命令的返回值,而不是 taskkill 的返回值。虽然 start 命令执行成功了,但您并不知道 taskkill 是否执行成功。 - Vegard Larsen

3
除了其他答案外,命令返回的数字值在Windows中被称为ERRORLEVEL。当在命令行上使用taskkill时,您可以使用以下命令使最后一个errorlevel可见:
```echo %ERRORLEVEL%```
echo %ERRORLEVEL%

1

返回值$return是程序返回的值。在Windows中,返回值0和1通常用于表示成功,因此您可以轻松判断终止是否成功。

然而,返回值128是任意的,意味着taskkill的程序开发人员自己决定的。128很可能意味着进程不存在。

不幸的是,没有任何文档记录taskkill的返回值。

如果您的目标是防止uper.exe存在,128和1的返回值都是可以接受的,您的代码将如下所示:

function kill_hr()
{
    exec("taskkill /IM uper.exe", $output = array(), $return);
    return $return == 1 || $return == 128;
}

如果uper.exe成功终止或者一开始就没有运行,该函数将返回true

编辑:重新阅读您的帖子,您可以尝试以下操作:使用runas以您的Web服务器用户身份启动命令提示符(从管理员命令提示符):

runas /user:account@machine cmd

然后您将拥有一个作为Web服务器运行的命令提示符,您可以从那里发出taskkill命令。然后您可能会看到一个文本错误消息。


我觉得我没有很好地解释我的问题!:) 问题是taskkill不成功,因为它没有返回0,并且我可以在任务列表中看到uper.exe没有被终止 - 我的问题是为什么它没有被终止,我该如何做到这一点? - Abs
尝试以 web 服务器用户身份启动命令提示符(找出 Apache 或 IIS 运行的用户),然后从那里运行 taskkill 命令。这可能会在命令行上为您提供错误消息。 - Vegard Larsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接