You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash循环脚本问题:Laravel Mix编译时无法输出计时信息避免部署超时

问题分析与解决方案

脚本问题根源

你的脚本逻辑存在核心错误:while yarn mix --production &> /dev/null; do ... 这种写法会先等待yarn mix --production命令完全执行完毕,才会进入循环体执行echo和sleep。这就导致脚本在编译的5-15分钟里完全没有输出,直到编译结束才会进入循环,自然看不到你预期的定时提示。

修正后的脚本

要实现编译过程中定时输出心跳信息,需要把yarn命令放到后台运行,然后通过循环检查进程是否存活,同时定时输出:

# 启动编译命令并后台运行,记录进程ID
yarn mix --production &> /dev/null &
YARN_PID=$!

COUNTER=0
# 循环检查编译进程是否存活
while kill -0 $YARN_PID 2>/dev/null; do
    echo "编译已运行 $COUNTER 秒"
    sleep 10
    COUNTER=$((COUNTER + 10))
done

# 等待进程完全结束,获取退出码
wait $YARN_PID
EXIT_CODE=$?

# 传递编译结果状态给部署工具
if [ $EXIT_CODE -eq 0 ]; then
    echo "编译成功完成,总耗时 $COUNTER 秒"
else
    echo "编译失败,退出码: $EXIT_CODE"
    exit $EXIT_CODE
fi

关键逻辑说明

  • yarn mix --production &> /dev/null &:将编译命令放到后台执行,&符号让脚本无需等待命令结束即可继续执行;&> /dev/null把所有输出(包括进度条)重定向到空设备,避免干扰心跳输出。
  • YARN_PID=$!:获取后台运行的yarn进程ID,用于后续检查进程状态。
  • kill -0 $YARN_PID 2>/dev/null:kill -0不会向进程发送任何终止信号,仅用于检查进程是否存在。如果进程存活则返回0,进入循环体输出心跳;进程结束则退出循环。
  • wait $YARN_PID:等待后台编译进程完全结束,获取其退出码,确保部署工具能正确识别编译是否成功。

额外优化建议

  • 若需要保留编译错误日志用于排查问题,可以修改输出重定向:yarn mix --production >/dev/null 2>build-error.log &,将错误信息写入build-error.log文件。
  • 可根据实际情况调整sleep的时间间隔,比如改为30秒,减少心跳输出的频率。

内容的提问来源于stack exchange,提问作者Gerard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:25:15