Linux后台进程停止求助:ngrok后台启动后自动终止
我明白你遇到的头疼问题——当你的Linux服务启动ngrok后,明明把它丢到后台运行,结果总是莫名其妙终止对吧?我之前折腾类似场景时也踩过这些坑,大概率是会话退出导致进程被SIGHUP信号杀死,再加上你之前的命令里重定向写法有问题,先给你拆解下问题,再给几个靠谱的解决办法:
先说说你之前命令的问题
- 单纯加
&的命令:./ngrok ... 22 &只是把进程放到后台,但如果启动它的父进程(你的Linux服务)退出,或者当前终端会话关闭,ngrok会收到系统发送的SIGHUP信号直接终止。 - 重定向顺序错误:你写的
& > /dev/null或者& > /ngrok/ngrok.log顺序搞反了,重定向要放在后台符号&前面,不然系统会把重定向当成命令参数,根本没生效。 - nohup用法错误:
nohup ./ngrok ... & > /ngrok/ngrok.log同样是顺序问题,nohup的输出重定向必须放在正确位置才能生效。
方法1:修正nohup的用法(最常用的后台运行方式)
nohup的核心作用就是让进程忽略SIGHUP信号,同时正确重定向所有输出,命令应该这么写:
nohup ./ngrok --config="./ngrok-config" -proto=tcp -subdomain="test" 22 > /ngrok/ngrok.log 2>&1 &
给你解释下关键部分:
2>&1:把标准错误(stderr)重定向到标准输出(stdout),这样所有日志(包括报错)都会写到指定的ngrok.log里&放在最后:代表把整个nohup命令放到后台运行- 这样即使启动它的父进程退出,ngrok也能继续保持运行状态
方法2:用screen/tmux(适合需要随时查看进程输出的场景)
如果你偶尔需要重新连接查看ngrok的实时输出,用screen会更灵活:
- 先安装screen(Debian/Ubuntu):
sudo apt install screen;CentOS/RHEL:sudo yum install screen - 创建一个专属会话:
screen -S ngrok_tunnel - 在会话里直接运行ngrok命令:
./ngrok --config="./ngrok-config" -proto=tcp -subdomain="test" 22 - 按下
Ctrl+A再按D,就能脱离这个会话,ngrok会在后台继续跑 - 之后要查看输出的话,输入
screen -r ngrok_tunnel就能重新连接会话
方法3:做成systemd服务(最稳定,适合长期运行)
如果你的Linux服务是长期在线的,最好把ngrok也做成systemd服务,这样系统启动时能自动拉起,进程意外终止还会自动重启:
- 创建服务文件:
sudo nano /etc/systemd/system/ngrok.service,填入以下内容(记得替换占位符):
[Unit] Description=Ngrok TCP Tunnel for SSH After=network.target [Service] Type=simple User=your_username # 替换成运行ngrok的用户名 WorkingDirectory=/path/to/ngrok # 替换成ngrok所在的目录 ExecStart=/path/to/ngrok --config="./ngrok-config" -proto=tcp -subdomain="test" 22 Restart=always # 进程意外终止时自动重启 RestartSec=5 # 重启间隔5秒 [Install] WantedBy=multi-user.target
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start ngrok - 设置开机自启:
sudo systemctl enable ngrok - 查看运行状态:
sudo systemctl status ngrok
最后几个排查点
- 检查ngrok配置文件
ngrok-config的路径是否正确,运行用户有没有读取权限 - 查看日志文件
/ngrok/ngrok.log(或者systemd日志journalctl -u ngrok),看看有没有认证失败、端口被占用这类具体报错 - 确保运行ngrok的用户有写入日志文件的权限,避免因为权限问题导致进程崩溃
内容的提问来源于stack exchange,提问作者Code Junkie
相关产品推荐
相关产品推荐

