加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP挂起时exec()bash脚本

发布时间:2020-12-13 16:55:10 所属栏目:PHP教程 来源:网络整理
导读:我有一些看起来像这样的代码行…… exec($this-path.' start /dev/null 21 ');return ['status' = 'Command executed']; $this- path是一个shell脚本,start是shell脚本的参数,我相信该行的其余部分是为了转储任何响应,所以php脚本可以继续运行.它没有像它应
我有一些看起来像这样的代码行……

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,因此任何错误也将被重定向到那里.因此,使用这两个,它会抑制命令将生成的任何消息.

最后& (&符号)最后将命令分配给新进程.从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,你正在做的应该是工作.必须有其他事情来阻止该过程成功分叉.只是为了排除PHP的问题,我首先尝试通过命令行而不是PHP的exec来执行命令.如果它仍然不起作用,我猜它是因为你的Job Control有问题.要么它以某种方式被禁用.我没有在PHP中尝试过这个,但您可以使用set -m命令(启用作业控制)来启用它.注意,要禁用作业控制而不是设置-m,请设置m.以下是如何在PHP中执行此操作:

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

您可以做的另一件事是在PHP脚本执行时,登录命令行并键入命令作业并查看其输出.如果它是空白的,PHP不会正确分配作业.你应该看到类似的东西:

[1]+  Stopped                 your_command.sh

注意这里说停止了.如果进程仍在运行,则可能不会停止此操作.

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

shopt -p | grep checkjobs

如果输出是shopt -u checkjobs,这不是问题.如果它反过来说shopt -s checkjobs,这可能会导致你看到的行为,因为用后台作业杀死一个shell会导致一个错误,说有工作正在运行,你实际上必须杀死shell两次才能摆脱它.也许这是PHP开发人员没有考虑的事情.在这种情况下,前置shopt -u checkjobs&&在PHP中执行命令之前.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读