gpt4 book ai didi

PHP 在 exec() bash 脚本时挂起

转载 作者:IT王子 更新时间:2023-10-29 01:26:32 24 4
gpt4 key购买 nike

我有几行代码看起来像这样......

exec($this->path.' start > /dev/null 2>&1 &');
return ['status' => 'Command executed'];

$this->path 是一个 shell 脚本,start 是 shell 脚本的参数,我相信该行的其余部分应该转储任何响应,以便 php 脚本可以继续运行。它没有像它应该的那样工作,php 成功启动了 shell 脚本(它启动了一个游戏服务器)但是 php 只是挂起,直到我使用 shell 关闭服务器。当我用 shell 关闭服务器时,它完成执行并且我收到“命令已执行”响应。我还禁用了 SELinux 的强制执行,以确保它不会造成干扰。

运行 Linux - Fedora 21 和内置的 PHP 开发服务器。

最佳答案

I believe the rest of the line is suppose to dump any response so the php script can continue running

如果你不明白,这里有解释。如果你有:

exec($this->path.' start > /dev/null 2>&1 &');

>/dev/null 部分意味着将 stdout(即命令产生的常规输出)重定向到/dev/null(即空设备)。因此,命令本身产生的任何输出都将被抑制。

2>&1 部分表示将 stderror(即执行命令产生的任何错误)重定向到 stdout。然而,由于 stdout 被重定向到/dev/null,任何错误也将被重定向到那里。因此,对于这两个,它会抑制命令将产生的任何消息。

最后,末尾的 &(&符号)将命令 fork 到一个新进程。来自Bash man page :

If a command is terminated by the control operator &, the shell executes the command in the background in a subshell. The shell does not wait for the command to finish, and the return status is 0 (true).

然而,根据this question ,您正在做的事情应该有效。一定有其他事情在阻止进程成功 fork 。为了排除 PHP 的问题,我首先尝试通过命令行而不是通过 PHP 的 exec 来执行命令。如果还是不行,我猜是因为你的Job Control有问题.要么它以某种方式被禁用。我没有在 PHP 中尝试过,但您可以使用 set -m 命令(启用作业控制)启用它。请注意,要禁用作业控制而不是 set -m,您可以执行 set +m。以下是如何在 PHP 中执行此操作:

exec('set -m && ' . $this->path.' start > /dev/null 2>&1 &');

您可以做的另一件事是,当 PHP 脚本正在执行时,登录到命令行并键入命令 jobs 并查看其输出。如果它是空白的,则 PHP 没有正确地 fork 作业。你应该看到类似这样的东西:

[1]+  Stopped                 your_command.sh

注意这里是如何说stopped的。如果进程仍在运行,这可能不应该停止

您可以做的另一件事是查看checkjobs 是启用还是禁用。登录服务器并执行以下命令以获取内置的 shell optional behavior :

shopt -p | grep checkjobs

如果输出是 shopt -u checkjobs,这不是问题所在。如果它改为显示 shopt -s checkjobs,这可能会导致您看到的行为,因为用后台作业终止 shell 会导致错误,指出有作业正在运行,您实际上必须终止 shell 两次摆脱它。也许这是 PHP 开发者没有考虑到的。在这种情况下,在您的 PHP 命令之前添加 shopt -u checkjobs &&

exec('shopt -u checkjobs && ' . $this->path.' start > /dev/null 2>&1 &');

关于PHP 在 exec() bash 脚本时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27747213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com