如何在AWS Ubuntu实例中稳定运行后台Python长时脚本?
问题原因分析
核心原因:SIGHUP信号导致进程终止
你用python long_running_script.py &把进程放到后台,但它仍然属于当前SSH终端的会话组。当你关闭SSH连接(包括VSCode内置终端断开)时,终端会向所属的所有进程发送SIGHUP(挂起信号),默认情况下进程收到这个信号就会终止。
为什么偶尔能成功运行完?可能是终端退出时的信号传递出现了异常(比如VSCode终端的退出逻辑差异),但这种情况完全不可靠,不能依赖。
其他可能原因
- 学校CloudBank账号的限制:部分机构的共享云账号会设置闲置进程清理策略,即使进程资源占用不高,长时间无交互的进程也可能被系统自动终止。
- 进程组关联问题:后台进程如果没脱离原进程组,会话 leader(终端)退出时,整个进程组会被操作系统清理。
远程长期运行脚本的推荐方案
1. 使用nohup(最简单直接)
nohup命令会让进程忽略SIGHUP信号,同时将标准输出和错误重定向到指定文件,彻底脱离终端会话的控制。
执行命令:
nohup python long_running_script.py > script.log 2>&1 &
> script.log:把标准输出写入script.log2>&1:把标准错误重定向到和标准输出同一个文件&:让进程在后台运行
之后可以用ps aux | grep long_running_script.py查看进程状态,日志直接查看script.log即可。
2. 使用终端复用工具(screen/tmux,适合需要随时交互查看)
这类工具会创建持久化的终端会话,即使SSH断开,会话依然在服务器上运行,重新连接后可以恢复会话查看脚本状态。
用tmux的示例步骤:
- 安装tmux:
sudo apt install tmux - 创建新会话:
tmux new -s script_session - 在新会话里运行你的脚本:
python long_running_script.py - 按下
Ctrl+B然后松开,再按D,即可脱离当前会话,回到原来的终端 - 关闭SSH后,下次重新连接服务器,执行
tmux attach -t script_session就能回到之前的会话,查看脚本运行状态
3. 配置systemd服务(最稳定,适合长期/开机自启的脚本)
如果脚本需要长期稳定运行,甚至服务器重启后自动恢复,推荐将其配置为systemd服务,由系统进程管理器托管。
步骤:
- 创建服务配置文件:
sudo nano /etc/systemd/system/long_script.service - 写入以下内容(根据你的实际路径和用户修改):
[Unit] Description=Long Running Python Script After=network.target [Service] User=ubuntu # 替换为你的服务器用户名 WorkingDirectory=/home/ubuntu/script_dir # 替换为脚本所在目录 ExecStart=/usr/bin/python long_running_script.py # 替换为脚本路径 Restart=on-failure # 进程失败时自动重启 StandardOutput=append:/home/ubuntu/script_dir/script.log # 日志文件路径 StandardError=append:/home/ubuntu/script_dir/script_error.log [Install] WantedBy=multi-user.target
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start long_script - 设置开机自启(可选):
sudo systemctl enable long_script
可以用以下命令管理服务:
- 查看状态:
sudo systemctl status long_script - 查看日志:
journalctl -u long_script -f(实时查看) - 停止服务:
sudo systemctl stop long_script
内容的提问来源于stack exchange,提问作者k-c
相关产品推荐
相关产品推荐

