LabHub
学习 学习路径 课程

调试实战

把环境差异收窄

在 LabHub 中继续学习

目标

听到“在我们的服务器上可以运行”时,能够怀疑环境而不是代码,并在 30 分钟内定位环境差异。

为什么重要

环境问题比代码缺陷更难查找。代码可以通过阅读发现问题,而环境没有现成内容可供阅读。因此需要固定的排查顺序;将该顺序固化为脚本后,与客户的往返沟通可以从三次减少到一次。

本练习涉及的三类问题按现场出现频率排列。环境变量的问题大多是配置位置与读取位置不同。编码问题在包含韩文的客户数据中极为常见:Windows 生成的 CSV 往往不是 UTF-8,而是 EUC-KR(CP949);错误解码的字符串会在没有报错的情况下悄然保存,几周后才以“无法搜索”的问题反馈回来。权限问题在凭据文件上尤其严重——令牌文件若设为 644,同一服务器上的其他用户都能读取;安全检查时,仅此一项就会损害整个项目的可信度。

/opt/app/envcheck.sh 不是需要修改的对象。本任务要求调整环境,使其满足该脚本的要求。

步骤

  1. 创建 /root/env 目录。
  2. 原样运行 bash /opt/app/envcheck.sh,将失败输出保存到 /root/env/fail.txt
  3. 将失败消息指出的环境变量名称写入 /root/env/missing_var.txt
  4. /opt/data/customers_kr.csv 转换为 UTF-8,并保存到 /root/env/customers_utf8.csv。韩文必须能够正确读取。
  5. 将转换后文件中扣除表头的客户行数写入 /root/env/kr_rows.txt
  6. 创建 /root/env/token.txt,并将权限设为 600
  7. 提供所需环境变量,再次运行 envcheck.sh,将成功输出保存到 /root/env/result.txt
  8. /root/env/report.md 中说明有哪些差异。必须包含环境变量名称、原始文件的编码名称和所应用的权限数字。

参考

创建工作目录

创建 /root/env 目录。

将产出物集中放在 /root/env 下。

重现并保存失败

原样运行 bash /opt/app/envcheck.sh,将失败输出保存到 /root/env/fail.txt

直接运行 bash /opt/app/envcheck.sh 会失败。将输出原样保存到文件。

写下缺失的环境变量名称

将失败消息指出的环境变量名称写入 /root/env/missing_var.txt

失败消息会直接说明变量名称。只写该名称。

恢复韩文 CSV

/opt/data/customers_kr.csv 转换为 UTF-8,并保存到 /root/env/customers_utf8.csv。韩文必须能够正确读取。

/opt/data/customers_kr.csv 无法按 UTF-8 读取。回想韩国 Windows 生成文件时常用的编码,并使用 iconv 转换。

统计客户行数

将转换后文件中扣除表头的客户行数写入 /root/env/kr_rows.txt

统计转换后文件中不含表头的数据行数。

为令牌文件设置最小权限

创建 /root/env/token.txt,并将权限设为 600

创建 /root/env/token.txt,使其仅允许所有者读写。使用 chmod 的数字表示法。

通过环境检查

提供所需环境变量,再次运行 envcheck.sh,将成功输出保存到 /root/env/result.txt

将环境变量放在命令前,只会对该次执行生效。将通过检查的输出保存到文件。

编写环境差异报告

/root/env/report.md 中说明有哪些差异。必须包含环境变量名称、原始文件的编码名称和所应用的权限数字。

写明三项差异:变量名称、原始文件的编码名称以及所应用的权限数字。