如何防止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
相关产品推荐
相关产品推荐

