Bash脚本终端运行正常但Cron执行报错standard_in 1 syntax error
问题分析
Cron运行时出现standard_in 1 syntax error是因为传给bc的表达式存在语法问题,核心原因是**sratio或tdisks变量未获取到有效数值**,导致除法表达式无效(比如空值、非数字字符)。
解决步骤
1. 排查trap命令在Cron环境下的输出
Cron的环境变量(如PATH、LD_LIBRARY_PATH)与终端不同,可能导致/root/trap运行异常,输出不符合预期。可以临时修改Cron任务,把trap的输出保存下来:
* * * * * /root/trap -t -a > /tmp/trap_output.txt 2>&1
查看/tmp/trap_output.txt的内容,确认是否和终端执行时的输出一致。如果不一致,说明需要在脚本中补充trap依赖的环境变量。
2. 修改脚本,添加变量校验与错误处理
更新脚本,确保ratio.sh能捕获trap的执行错误,并校验变量的有效性:
#!/bin/bash # 补充必要的环境变量(根据实际情况调整,比如trap依赖的库路径) export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # 执行trap命令并捕获输出 trap_output=$(/root/trap -t -a) if [ $? -ne 0 ]; then echo "$(date): trap命令执行失败" >> /tmp/log.txt exit 1 fi # 计算sratio,使用更健壮的文本处理 sratio=$(echo "$trap_output" | awk -F '|' '{print $6}' | sed -e 's/[[:space:]]//g;/^$/d' | sed '1,2d' | awk '{n += $1}; END{print n + 0}') # 计算tdisks tdisks=$(echo "$trap_output" | grep -c "/dev/sd") # 校验sratio是否为有效浮点数 if ! [[ "$sratio" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then echo "$(date): sratio无效,值为: '$sratio'" >> /tmp/log.txt exit 1 fi # 校验tdisks是否为正整数 if ! [[ "$tdisks" =~ ^[1-9][0-9]*$ ]]; then echo "$(date): tdisks无效,值为: '$tdisks'" >> /tmp/log.txt exit 1 fi # 执行除法计算 result=$(echo "scale=4; $sratio / $tdisks" | bc) echo "$result" > /root/tratio.txt
3. 调整Cron任务的权限与输出
确保Cron任务以正确的用户运行(比如root,因为脚本里操作了/root下的文件),并保留详细日志:
* * * * * root /tmp/ratio.sh >> /tmp/log.txt 2>&1
关键优化点
- 用
$()替代反引号``,提升脚本的可读性和安全性; - 使用
[[:space:]]匹配所有空白字符,避免依赖特定的制表符/空格; - 添加
trap命令的执行状态检查,提前捕获命令失败的情况; - 对
sratio和tdisks做正则校验,确保传入bc的是有效数值; - 补充Cron缺失的环境变量,保证
trap能正常运行。
内容的提问来源于stack exchange,提问作者xrkr
相关产品推荐
相关产品推荐

