SSM SendCommand执行EC2上GPU密集型Python脚本无法完成问题求助
问题排查与解决思路
针对你遇到的SSM命令无法完成的问题,结合你的场景(GPU密集型脚本手动运行正常、SSM执行轻量脚本正常),可以从以下几个方向逐一排查:
1. 实例启动后SSM Agent未就绪就发送命令
start_instances是异步操作,实例进入running状态不代表SSM Agent已经完成注册并能正常接收命令。此时发送的命令可能会处于挂起状态,无法真正执行。
解决方法:
在发送SSM命令前,等待实例的SSM状态变为Online,或者等待EC2的系统/实例状态检查通过。可以通过Boto3接口轮询检查:
import time # 启动实例后,轮询等待SSM Agent就绪 while True: instance_info = ssm.describe_instance_information( InstanceInformationFilterList=[ {'key': 'InstanceIds', 'valueSet': [INSTANCE_ID]} ] ) if instance_info['InstanceInformationList'] and instance_info['InstanceInformationList'][0]['PingStatus'] == 'Online': break time.sleep(10) # 每10秒检查一次 # 确认就绪后发送SSM命令 response = ssm.send_command( DocumentName='AWS-RunShellScript', Parameters={'commands': [script], 'executionTimeout': ['18000']}, InstanceIds=[INSTANCE_ID] )
2. SSM执行环境与手动登录环境不一致
SSM的AWS-RunShellScript默认以ssm-user身份执行,而你手动操作使用的是ec2-user,两者的环境变量、权限可能存在差异——尤其是GPU相关的驱动、库路径可能未正确加载。
解决方法:
- 切换到
ec2-user身份执行命令,确保和手动操作的环境一致:
修改脚本内容,添加sudo -u ec2-user前缀:sudo -u ec2-user bash -c ' export HOME="/home/ec2-user" export PATH="<你的实际终端PATH>" cd /home/ec2-user/directory/src python script.py > /home/ec2-user/script_log.log 2>&1 ' - 加载用户环境配置:在脚本开头添加
source /home/ec2-user/.bashrc或source /etc/profile,确保GPU相关环境变量(如CUDA_HOME)被正确加载。
3. 脚本输出占满SSM缓冲区
如果计算密集型脚本有大量标准输出/错误输出,SSM的默认输出缓冲区可能被占满,导致命令挂起无法完成。
解决方法:
将脚本输出重定向到本地文件,避免占用SSM的输出缓冲区:
cd /home/ec2-user/directory/src python script.py > /home/ec2-user/script_output.log 2>&1
之后可以通过SSM的get_command_invocation接口查看日志,或直接登录实例查看文件内容。
4. 权限或资源访问问题
ssm-user可能没有权限访问脚本目录、执行脚本,或者无法调用GPU资源。
排查步骤:
- 在脚本中添加权限检查命令,比如
ls -l /home/ec2-user/directory/src/script.py,查看是否存在权限报错; - 添加
nvidia-smi命令,确认GPU资源在SSM会话中是否可用。
5. 脚本隐性交互逻辑
虽然手动运行正常,但脚本可能在非交互式环境(如SSM会话)中存在等待用户输入的逻辑,导致卡住。
解决方法:
检查脚本是否存在需要交互的步骤,修改为非交互式模式(比如添加--non-interactive类参数)。
内容的提问来源于stack exchange,提问作者DavidWebb
相关产品推荐
相关产品推荐

