Ubuntu服务执行Shell脚本时Python进程挂起问题求助
解决EC2 Ubuntu服务执行Python脚本挂起的问题
一、先排查终端与服务的环境差异
终端运行和systemd服务的运行环境完全不同,这是问题核心:
- 指定Python绝对路径:在终端执行
which python3拿到实际路径(比如/usr/bin/python3),把shell脚本里的python3替换成这个绝对路径——服务的PATH变量可能没包含你的Python安装路径。 - 统一用户权限:如果终端用ubuntu用户运行正常,就在服务文件里指定
User=ubuntu。否则root用户可能找不到ubuntu用户下的AWS凭证(~/.aws/credentials),导致Python连接DynamoDB失败挂起。
二、给Shell脚本加日志追踪
直接依赖journalctl看不到输出,就手动添加日志定位问题:
修改你的shell脚本,把所有输出重定向到日志文件:
echo "$(date) - Starting script..." >> /var/log/my_script.log 2>&1 # 替换成你的Python绝对路径和脚本路径 /usr/bin/python3 /home/ubuntu/your_script.py >> /var/log/my_script.log 2>&1 echo "$(date) - Script exited with code $?" >> /var/log/my_script.log 2>&1
然后给日志文件授权:sudo chown ubuntu:ubuntu /var/log/my_script.log,确保脚本能正常写入。
三、修正Systemd服务配置
服务配置错误会导致脚本挂起,用这个标准配置(保存为/etc/systemd/system/my_script.service):
[Unit] Description=Background Python Script Service After=network.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/script_dir # 替换成你的脚本所在目录 ExecStart=/home/ubuntu/your_shell_script.sh # 替换成shell脚本路径 Restart=always RestartSec=5 StandardOutput=journal+console StandardError=journal+console KillMode=process [Install] WantedBy=multi-user.target
关键配置说明:
After=network.target:确保网络完全启动后再运行脚本,避免因网络未就绪导致的API或DynamoDB连接失败。Restart=always:脚本崩溃或意外退出时自动重启,满足24/7后台运行需求。StandardOutput/StandardError:强制把输出写入journalctl,解决无日志输出的问题。
四、验证与调试步骤
- 重新加载服务配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start my_script - 检查服务状态:
sudo systemctl status my_script,查看是否有启动失败的直接提示。 - 实时查看日志:
sudo journalctl -u my_script -f,同时查看/var/log/my_script.log找Python的具体错误信息。 - 确认依赖:如果Python用了boto3、requests这类第三方库,确保ubuntu用户已经安装——用
pip3 install --user boto3 requests安装到用户目录,避免权限问题。
内容的提问来源于stack exchange,提问作者Ryan Mahuron
相关产品推荐
相关产品推荐

