【问题标题】:Running a PHP script that runs a Python script that runs a bash script, hangs on bash运行运行 bash 脚本的 Python 脚本的 PHP 脚本,在 bash 上挂起
【发布时间】:2014-10-09 18:54:26
【问题描述】:

我有一个 Python 脚本,它正在对视频进行编码,然后调用一个将新视频上传到保管箱的 shell 脚本。它在命令行中运行良好,但我需要制作它以便其他人可以执行它,所以我有一个调用 python 脚本的 PHP 脚本。

我不希望 PHP 脚本永远运行(它需要 15-30 分钟才能完成),我只是希望它启动 python 脚本并完成。我想出了实现这一目标所需的条件,就像我说的那样,它可以在命令行上运行。但是当它通过 PHP 调用时,视频会编码,但文件永远不会上传。我可以看到 Dropbox 脚本被启动并被列为使用一定百分比 CPU 的进程,该百分比永远不会改变,它似乎卡住/死了。

命令看起来像这样,正在使用 cmd() 运行

script.py -options &>/logs/phptopython.log &

使用 Popen 启动 shell 脚本

有什么建议吗?

谢谢

【问题讨论】:

标签: php python bash shell


【解决方案1】:

听起来这可能是权限问题。仔细检查您尝试上传视频的目录的权限。如果您在 Linux 上,您可以像这样修改该目录的权限:

chmod 755 /path/to/dir

这为文件所有者提供了读取、写入和执行权限 (7)。该组和其他用户获得读取和执行权限 (5)。

Apache 可能以不同的用户身份运行,而不是您自己在 bash 中运行命令。快速测试是否是权限问题是在该目录上授予 777。不过我不会这样——它只是一种快速确定权限是否存在问题的方法。

如果脚本使用 777 权限,您可以将目录的所有者更改为 Apache 运行的用户,或者将 Apache 用户添加到目录的组并授予组写入权限。

编辑: 我刚刚注意到你说你使用 cmd(),所以我猜你是在 Windows 上。我的 cmets 可能仍然有用,但 chmod 命令在 Windows 上不起作用。

【讨论】:

  • 我在 linux 上,我打错了,exec() 是使用的 PHP 命令,而不是 cmd()。这不是权限问题,目录已经是 777。另外 www-data 正在调用 Python 脚本,该脚本正在调用 ffmpeg 将文件编码到同一个目录(所以如果它可以在那里写入文件,你会认为它可以访问它也可以用于 ulpoad)。
  • 好棒。您还可以尝试检查 Apache 错误日志。也许它有一个错误可以为您指明正确的方向。 Apache 错误日志通常位于 /var/log/apache/error.log 之类的位置。
  • 错误日志中没有任何内容。 FWIW 也不会将任何内容写入命令中的日志文件。 &>/logs/phptopython.log & 当我通过 cmd 行运行它时,我确实在那里得到了输出。并且查看 webmin > 进程,这两个命令在几个小时前仍然存在,相同的 CPU %。
  • 您是否在脚本末尾关闭管道?如果是这样,我想它只是没有达到那个地步。我以前使用过一次在后台运行进程并在完成后关闭它:plcose(popen('script.py', 'r'));
  • 这似乎与输出的重定向有关,因此 PHP 快速结束。在我添加之前,PHP 脚本运行并运行,但它确实完成了。是调用脚本的 Python process = Popen(script.sh, STDOUT=PIPE) process.communicate() exit_code = process.wait()