【问题标题】:Bash script called with shell_exec in PHP never finish在 PHP 中用 shell_exec 调用的 Bash 脚本永远不会完成
【发布时间】:2020-09-21 09:25:36
【问题描述】:

我有一个网站,我希望用户能够下载文件夹的所有内容。为此,我制作了一个 php 脚本,让用户可以选择创建备份文件。由于这个文件可能相当大(几 GB 的数据),我将用于备份的脚本制作为 bash 脚本,然后通过 php shell_exec 命令运行。

bash 脚本在直接从 putty 终端和从 PHP 调用时都可以正常运行,但如果要备份的文件太多,则从 PHP 调用时(不是直接调用时),进程会在未完成的情况下停止。

调用脚本的bash命令是“bash backup_shell_zip”,调用php文件中的shell_exec命令是shell_exec("bash backup_shell_zip 2>/dev/null >/dev/null &");

我可以看到,当脚本在我拥有大约 12 Gb 文件的大型站点上运行以进行备份时,直接从腻子终端调用时大约需要 12 分钟才能完成。当从 php shell_exec 调用相同的脚本时,它会运行大约 2.5 分钟,然后终止而没有完成(备份了大约 3 Gb)。当我从一个较小的示例(小于 3 Gb)运行相同的脚本时,它可以正常工作,但也可以在 2 分钟左右完成。

所以看起来进程(bash 脚本)即使在一段时间(或资源)使用后仍未完成,也会终止。也许这与服务器如何关注进程有关,但我不是“服务器人”,所以我希望有人能提供帮助;-)

/马耳他

调用 Bash 脚本的 PHP 脚本

shell_exec("bash backup_shell_zip 2>/dev/null >/dev/null &");

Bash 脚本

#!/bin/bash

BACKUPFILES="files"
DEST="backup"
CHUNKSIZE="500M"

# Filename
DAY=$(date +%F-%T)
ARCHIVE="backup_files"
FILENAME="$ARCHIVE-$DAY.zip"

# Print status
echo $(date +%T)
echo "Creating backup from $BACKUPFILES to $DEST/$FILENAME"

# Create ZIP-files
zip -r -s $CHUNKSIZE $DEST/$FILENAME $BACKUPFILES 

# Print status
echo $(date +%T)
echo "Finished"

【问题讨论】:

  • 也许尝试在调用shell_exec之前将时间限制设置为20分钟set_time_limit(1200)
  • 我使用2>/dev/null >/dev/null & 发送shell_exec 命令,因此它应该在后台运行,并且不受time_limit 或ini (max_execution_time) 的影响,但我都尝试过,但均未成功...
  • @MaltevonSehested :我不明白,在后台运行它应该如何防止脚本被时间限制中止。我觉得你扔掉标准错误有点不明智。你有没有想过脚本可能会因为一些错误而中止,并在死前向 stderr 写入一些有用的消息?
  • 由于脚本从命令行运行良好,我认为这不是问题所在。它也需要几分钟才能完成,所以整个想法是用户启动备份,然后稍后返回下载页面并下载带有备份的 zip 文件。如果我没有将脚本扔到后台,它将“挂起”网络浏览器直到完成,用户将无法执行其他任务......
  • 我怀疑原因是系统发现启动 shell 的 php 不再“活动”并且杀死了 shell。也许有可能让守护进程或其他东西运行脚本然后让 php 调用它,但我并不是真正的服务器专家,所以在这里我有点超出我的知识领域;-)

标签: php linux bash shell-exec


【解决方案1】:

原来这是 apache 用户的资源问题,而不是给出超时的 shell 用户。没有简单的解决方案,但我目前正在使用一个 cron-job,如果要备份的文件夹很大,它可以将任务分成几个较小的作业......

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多