【问题标题】:Execute .bat file, without waiting for end执行 .bat 文件,无需等待结束
【发布时间】:2012-02-19 10:57:04
【问题描述】:

我正在尝试制作一种面板,我希望在其中对应用程序(游戏服务器)进行“启动/停止”操作。

HTTP 服务器在 Windows Server 2008 R2(WAMP SERVER 64 位)上运行

我发现我可以使用:psExec,它不等待完成应用程序,并且至少为我提供了 PID。

有一个.bat的代码:

cd "C:\Program Files (x86)\LucasArts\Star Wars Jedi Knight Jedi Academy\GameData\"
.\jampded  +set dedicated 2 +set net_port 29075 +set fs_game lugormod +exec server.cfg 

和 PHP 代码:

<?php
$command = "\"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\PsExec.exe\" -d \"C:\\Program Files (x86)\\LucasArts\\Star Wars Jedi Knight Jedi Academy\\GameData\\serverstart.bat\"";
//echo ($command);
exec("$command");
?>

显示:执行test.php时出错,执行时间超过30s

但是当我在控制台中编写该命令时,它会显示 PID,并自动退出,即使启动时 prog 仍在运行。

(对不起我的英语;))

【问题讨论】:

标签: php windows apache exec


【解决方案1】:

PsExec 应该足以在后台运行进程,但是它需要用户首先接受 EULA(交互式窗口)。如果你从命令行运行它,你已经接受了条款,但是 apache(以及 apache 下的 php)以尚未接受条款的系统用户身份运行。

您可以尝试使用 /accepteula 选项运行 psexec,看看是否有帮助。

[+] 获取 PID 输出:

echo exec('psexec.exe -accepteula -i -d "c:/file.bat" 2>&1')

【讨论】:

  • 因为 psexec 将 pid 写入 STDERR 并且系统用户没有活动会话在运行,所以您需要在 psexec 参数中添加 -i 并将 STDERR 重定向到 STDOUT:echo exec('psexec.exe -accepteula -i -d "c:/file.bat" 2&gt;&amp;1')
  • 好的,显示的PID是CMD.exe的,我需要jampded.exe的PID(从bat文件启动的应用程序),有什么办法吗?
  • 要么在没有 bat 文件的情况下运行代码,要么使用带有过滤器的 tasklist 来查找它。
【解决方案2】:

试试这个:

$command = "Path_to_your_bat_file";
pclose(popen("start /B ". $command, "r"));

它对我有用..

【讨论】:

  • 只有在不需要保持进程运行的情况下才会起作用
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2023-03-21
  • 2022-07-01
  • 2022-12-18
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多