PHP挂起时exec()bash脚本

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP挂起时exec()bash脚本脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些看起来像这样的代码行……

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开发服务器.

解决方法

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

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

> / dev / null部分表示将stdout(即命令生成的常规输出)重定向到/ dev / null(这是空设备).因此,命令本身产生的任何输出都将被抑制.

2>& 1部分意味着将stderror(即由执行命令产生的任何错误)重定向到stdout.但是,由于stdout被重定向到/ dev / null,因此任何错误也将被重定向到那里.因此,使用这两个,它会抑制命令将生成的任何消息.

最后& (&符号)最后将命令分配给新进程.从Bash man page

但是,根据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 &');

脚本宝典总结

以上是脚本宝典为你收集整理的PHP挂起时exec()bash脚本全部内容,希望文章能够帮你解决PHP挂起时exec()bash脚本所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。