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

如何防止bash脚本提前退出 让ngrok在终端前台正常运行

问题原因

你写的脚本存在两个核心问题导致运行效果不符合预期:

  • sendurl()是空函数定义,既没有实际的地址获取、发送逻辑,也没有等待ngrok完成启动、生成公网地址的等待逻辑
  • 直接将ngrok放入后台后立刻执行fg的时序不符合shell作业控制的运行逻辑,脚本执行完所有语句后就会退出,不会持续将ngrok挂在当前终端前台。
正确实现方案

ngrok启动后默认会在本地127.0.0.1:4040开放API接口,不需要抓取TUI界面输出就能直接拿到生成的公网地址,稳定性更高。完整可运行脚本如下:

#!/bin/bash
# 后台启动ngrok,传入所有外部传入的启动参数
ngrok "$@" >/dev/null 2>&1 &
NGROK_PID=$!

# 轮询等待ngrok本地API服务启动完成
while ! curl -s http://127.0.0.1:4040/api/tunnels >/dev/null; do
    sleep 0.5
done

# 提取生成的公网访问地址
PUB_URL=$(curl -s http://127.0.0.1:4040/api/tunnels | grep -o '"public_url":"[^"]*' | cut -d'"' -f4 | head -n1)

# 替换为你自己的地址发送逻辑,比如推送通知、发webhook、发邮件都写在这里
echo "ngrok公网地址:$PUB_URL"

# 将ngrok切回前台接管当前终端,和手动执行ngrok命令的运行效果完全一致
fg %1
使用注意事项
  • 给脚本添加可执行权限:chmod +x ngrok-auto-send.sh
  • 运行时直接传参即可,例如./ngrok-auto-send.sh http 80,不要用sh ngrok-auto-send.sh执行,否则会因为shell不支持bash作业控制特性出现异常
  • 如果你手动修改过ngrok的本地API默认端口,把脚本里的4040替换为你实际设置的端口即可
  • 切回前台后所有操作和手动启动ngrok完全一致,按Ctrl+C即可正常终止进程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:42:16