AWS CLI版本检查脚本手动正常但crontab执行失败求助
问题分析与解决建议
核心问题
- Cron环境差异:Cron执行时使用极简环境变量,缺少交互式Shell中的Locale(编码)设置,导致升级后的AWS CLI(基于Python/PyInstaller打包)在处理文本编码时抛出
UnicodeEncodeError。 - 脚本命令数组使用错误:当前脚本中
myCmd数组的定义方式不符合Bash数组的正确用法,可能引发潜在的命令解析问题。
1. 确认Cron的运行环境(SLES系统)
要查看Cron使用的环境变量,可创建临时Cron任务导出环境:
# 执行crontab -e编辑root的定时任务,添加以下内容 * * * * * env > /tmp/cron_root_env.txt
等待1分钟后查看/tmp/cron_root_env.txt,对比交互式Shell下的env输出(执行env > /tmp/root_interactive_env.txt),重点关注LANG、LC_*等Locale相关变量——Cron默认通常不会设置UTF-8编码。
2. 修复脚本与编码问题
方案一:在脚本中强制设置UTF-8 Locale
修改脚本,在开头添加Locale设置,并修正命令数组用法:
#!/usr/bin/env bash # 强制设置UTF-8编码环境 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 # 查找AWS CLI路径 if [ -e "/usr/local/bin/aws" ]; then myAWS="/usr/local/bin/aws" else myAWS="/usr/bin/aws" fi # 正确定义命令数组(每个参数为单独元素) myCmd=("${myAWS}" "--version") # 打印命令 echo "${myCmd[@]}" # 执行命令并捕获输出 message=$("${myCmd[@]}") echo "$message"
方案二:在Crontab中直接指定Locale
如果不想修改脚本,可在Cron任务中直接添加环境变量:
57 21 * * * LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 /rough/scripts/log/test.sh > /rough/scripts/log/test.log 2>&1
3. 为什么重装AWS CLI无效?
该错误并非AWS CLI本身的问题,而是Cron环境缺少必要的编码配置,导致Python运行时无法正确处理文本编码。重装CLI不会改变Cron的环境变量设置,因此无法解决问题。
内容的提问来源于stack exchange,提问作者AashkaTe
相关产品推荐
相关产品推荐

