这个问题的核心在于:当你在SSH终端直接运行程序时,程序是与当前终端会话绑定的。一旦你关闭SSH窗口或网络波动导致连接断开,程序就会收到终止信号并退出。
下面介绍一个生产环境的标准做法,程序会随系统启动,并由系统监控。
1.创建服务配置文件:
sudo nano /etc/systemd/system/video_relay.service
2.写入以下配置(根据你的实际路径和用户名调整):
[Unit]
Description=ESP32 Video Relay Server
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/video_relay
ExecStart=/usr/bin/python3 /home/ubuntu/video_relay/video_relay_server.py
Restart=always # 程序意外退出时自动重启
RestartSec=5 # 重启前等待5秒
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=video_relay
[Install]
WantedBy=multi-user.target
3.保存退出 (Ctrl+X, Y, 回车)
当你按Ctrl+X,然后按Y后,应该会出现文件名确认界面。此时需要按回车键(Enter)才能真正保存。
这里说下其他的两种在服务器编辑的方法
方法1:使用tee命令直接创建(最简单)
sudo tee /etc/systemd/system/video_relay.service > /dev/null << 'EOF'
[Unit]
Description=ESP32 Video Relay Server
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/video_relay
ExecStart=/usr/bin/python3 /home/ubuntu/video_relay/video_relay_server.py
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=video_relay
[Install]
WantedBy=multi-user.target
EOF
方法2:使用cat命令
sudo cat > /etc/systemd/system/video_relay.service << 'EOF'
[Unit]
Description=ESP32 Video Relay Server
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/video_relay
ExecStart=/usr/bin/python3 /home/ubuntu/video_relay/video_relay_server.py
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=video_relay
[Install]
WantedBy=multi-user.target
EOF
4.重新加载 systemd 配置并启用服务:
sudo systemctl daemon-reload
sudo systemctl start video_relay.service # 立即启动
sudo systemctl enable video_relay.service # 设置开机自启
5.查看服务状态和日志:
sudo systemctl status video_relay.service
sudo journalctl -u video_relay.service -f # 查看实时日志(类似你的调试输出)

6.管理命令:
sudo systemctl stop video_relay.service # 停止
sudo systemctl restart video_relay.service # 重启
sudo systemctl disable video_relay.service # 取消开机自启