You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,解决无日志输出的问题。

四、验证与调试步骤

  1. 重新加载服务配置:sudo systemctl daemon-reload
  2. 启动服务:sudo systemctl start my_script
  3. 检查服务状态:sudo systemctl status my_script,查看是否有启动失败的直接提示。
  4. 实时查看日志:sudo journalctl -u my_script -f,同时查看/var/log/my_script.log找Python的具体错误信息。
  5. 确认依赖:如果Python用了boto3、requests这类第三方库,确保ubuntu用户已经安装——用pip3 install --user boto3 requests安装到用户目录,避免权限问题。

内容的提问来源于stack exchange,提问作者Ryan Mahuron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:05:04