如何在AWS EC2 Ubuntu实例运行Python脚本及解决启动脚本异常
问题2:EC2 UserData自动执行Python脚本无效的调整方案
我一看你的UserData写法就知道问题出在哪了,先给你分析原因,再给具体解决办法:
问题根源
- UserData默认以root身份执行:你写的
cd ~/env/xxx/bin/里的~指向root的家目录(/root/),但你的conda环境肯定是在ubuntu用户的家目录(/home/ubuntu/)下,路径完全不匹配,自然找不到文件。 - 命令未正确分隔:所有命令挤在一行,Shell会把它们当成单个命令执行,必然报错。
- 环境变量不匹配:root用户的环境变量里没有conda的配置,就算路径对了,
source activate也无法正常激活环境。
调整方案
方案一:切换到ubuntu用户执行(推荐)
把你的UserData改成下面这样,确保命令在ubuntu用户的环境下运行:
#!/bin/bash # 切换到ubuntu用户并执行后续命令 su - ubuntu <<EOF cd /home/ubuntu/env/xxx/bin/ source activate python3.6 /home/ubuntu/env/xxx/source/test.py EOF
su - ubuntu会完全切换到ubuntu用户的环境,包括加载该用户的.bashrc/.profile,确保conda配置生效。- 用
<<EOF和EOF包裹命令,保证所有操作都在ubuntu用户的会话中执行。 - 全部使用绝对路径,彻底避免
~带来的路径歧义。
方案二:用绝对路径直接执行
如果不想切换用户,可以先给conda环境目录加权限,再用绝对路径执行:
#!/bin/bash # 给ubuntu用户的环境目录加可读可执行权限,让root能访问 sudo chmod -R 755 /home/ubuntu/env/ # 用绝对路径激活conda环境 source /home/ubuntu/env/xxx/bin/activate # 运行脚本 python3.6 /home/ubuntu/env/xxx/source/test.py
排查小技巧
每次实例启动后,UserData的执行日志会存在/var/log/cloud-init-output.log里,登录abc2后可以查看日志定位具体错误:
cat /var/log/cloud-init-output.log
日志会明确告诉你是路径错误还是命令执行失败,帮你快速解决问题。
内容的提问来源于stack exchange,提问作者Rick.Wang
相关产品推荐
相关产品推荐

