如何在AWS EC2后台用nohup运行Python代码,避免SSH断开后进程终止?
解决AWS EC2断开SSH后Python脚本终止的问题
看起来你已经尝试用nohup来让脚本后台运行了,不过咱们可以一步步确认操作是否到位,再给你几个更稳妥的方案:
1. 确认nohup的执行效果
你已经执行了:
nohup /home/ec2-user/task1/vote.py &
这个命令会把进程放到后台,默认将输出写入当前目录的nohup.out文件。你可以通过以下命令确认进程是否还在运行:
ps aux | grep vote.py
如果能看到PID为27248的对应进程,说明已经成功后台运行。断开SSH后重新连接实例,再用同样的命令检查进程是否存在即可。
如果进程还是消失了,大概率是脚本本身存在依赖终端输入、或者运行中异常退出的问题,你可以查看nohup.out里的日志排查:
cat nohup.out
2. 更灵活的后台会话方案:screen或tmux
如果你需要随时重新连接到脚本的运行终端(比如查看实时输出、临时调试),screen或者tmux会比nohup更实用:
使用screen
- 先安装
screen(根据EC2实例的系统选择命令):
sudo yum install screen # 适用于Amazon Linux/CentOS # 或者 sudo apt install screen # 适用于Ubuntu/Debian
- 创建一个专属会话:
screen -S vote_session
- 在这个会话里运行你的脚本:
python /home/ec2-user/task1/vote.py
- 按下
Ctrl+A再按D,就能脱离这个会话,此时断开SSH进程依然会持续运行。 - 下次连接EC2后,重新回到会话:
screen -r vote_session
使用tmux(更现代的替代工具)
- 安装
tmux:
sudo yum install tmux # 或者 sudo apt install tmux
- 创建会话:
tmux new -s vote_session
- 运行脚本后,按下
Ctrl+B再按D脱离会话。 - 重新连接会话:
tmux attach -t vote_session
3. 持久化运行:配置systemd服务
如果希望脚本在EC2实例启动时自动运行,并且异常退出后能自动重启,推荐将脚本配置成systemd服务:
- 创建服务配置文件:
sudo vi /etc/systemd/system/vote.service
- 写入以下内容(注意根据你的实际路径调整):
[Unit] Description=Vote Data Collection Script After=network.target [Service] User=ec2-user WorkingDirectory=/home/ec2-user/task1 ExecStart=/usr/bin/python /home/ec2-user/task1/vote.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
- 重新加载systemd配置:
sudo systemctl daemon-reload
- 启动服务并设置开机自启:
sudo systemctl start vote sudo systemctl enable vote
- 查看服务状态和实时日志:
sudo systemctl status vote # 查看实时运行日志 journalctl -u vote -f
这样配置后,不管是断开SSH还是实例重启,脚本都会持续运行,还能自动恢复异常退出的情况。
内容的提问来源于stack exchange,提问作者Yipin




