如何让AWS EC2 Ubuntu实例启动时以ec2-user运行Python脚本
解决AWS EC2 Ubuntu实例启动时以ec2-user执行Python脚本的问题
核心问题根源
切换到ec2-user时使用的是非登录shell,未加载该用户的环境配置文件(如.profile、.bashrc),导致PATH等环境变量缺失,无法找到Python、chromedriver等依赖程序。
具体解决方案
方法1:通过登录shell切换执行(最简单直接)
在用户数据中使用su的-l参数(模拟登录shell)或sudo的-i参数,强制加载ec2-user的完整环境:
# 使用su的方式 su - ec2-user -c "cd /实际脚本目录 && python myscript.py" # 或使用sudo的方式 sudo -i -u ec2-user bash -c "cd /实际脚本目录 && python myscript.py"
替换
/实际脚本目录为你的myscript.py所在的真实路径。
方法2:手动指定环境变量执行
如果不想依赖登录shell,可以先登录ec2-user执行echo $PATH拿到完整路径,再在用户数据中手动注入环境变量:
sudo -u ec2-user bash -c 'export PATH="/home/ec2-user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" && cd /实际脚本目录 && python myscript.py'
把上述
PATH值替换为你从ec2-user账户中获取的真实路径。
方法3:创建systemd服务(适合长期后台运行的脚本)
如果脚本需要持续运行,推荐用systemd管理,稳定性更高:
- 在用户数据中写入服务配置文件:
cat <<EOF > /etc/systemd/system/myscript.service [Unit] Description=Run myscript.py as ec2-user After=network.target [Service] User=ec2-user Group=ec2-user WorkingDirectory=/实际脚本目录 ExecStart=/home/ec2-user/.local/bin/python myscript.py Restart=always [Install] WantedBy=multi-user.target EOF
- 启用并启动服务:
systemctl daemon-reload systemctl enable myscript.service systemctl start myscript.service
替换
WorkingDirectory为脚本所在目录,ExecStart中的Python路径用which python在ec2-user账户下查询到的真实路径。
验证执行状态
可以在用户数据中添加日志输出,方便排查问题:
su - ec2-user -c "python --version && which python && which chromedriver" >> /var/log/myscript_startup.log 2>&1
后续可通过查看/var/log/myscript_startup.log确认环境是否加载正常。
内容的提问来源于stack exchange,提问作者Dr-Nuke
相关产品推荐
相关产品推荐

