把环境差异收窄
目标
听到“在我们的服务器上可以运行”时,能够怀疑环境而不是代码,并在 30 分钟内定位环境差异。
为什么重要
环境问题比代码缺陷更难查找。代码可以通过阅读发现问题,而环境没有现成内容可供阅读。因此需要固定的排查顺序;将该顺序固化为脚本后,与客户的往返沟通可以从三次减少到一次。
本练习涉及的三类问题按现场出现频率排列。环境变量的问题大多是配置位置与读取位置不同。编码问题在包含韩文的客户数据中极为常见:Windows 生成的 CSV 往往不是 UTF-8,而是 EUC-KR(CP949);错误解码的字符串会在没有报错的情况下悄然保存,几周后才以“无法搜索”的问题反馈回来。权限问题在凭据文件上尤其严重——令牌文件若设为 644,同一服务器上的其他用户都能读取;安全检查时,仅此一项就会损害整个项目的可信度。
/opt/app/envcheck.sh 不是需要修改的对象。本任务要求调整环境,使其满足该脚本的要求。
步骤
- 创建
/root/env目录。 - 原样运行
bash /opt/app/envcheck.sh,将失败输出保存到/root/env/fail.txt。 - 将失败消息指出的环境变量名称写入
/root/env/missing_var.txt。 - 将
/opt/data/customers_kr.csv转换为 UTF-8,并保存到/root/env/customers_utf8.csv。韩文必须能够正确读取。 - 将转换后文件中扣除表头的客户行数写入
/root/env/kr_rows.txt。 - 创建
/root/env/token.txt,并将权限设为600。 - 提供所需环境变量,再次运行
envcheck.sh,将成功输出保存到/root/env/result.txt。 - 在
/root/env/report.md中说明有哪些差异。必须包含环境变量名称、原始文件的编码名称和所应用的权限数字。
参考
iconv -f EUC-KR -t UTF-8 입력 > 출력- 像
API_TOKEN=xxx bash /opt/app/envcheck.sh这样放在命令前,只对该次执行生效。 chmod 600 파일,使用stat -c %a 파일确认。- 常见错误 1:第 7 步在另一个 shell 中执行
export,再在这里运行。环境变量会沿进程继承。 - 常见错误 2:第 4 步没有转换,只是复制文件。请确认韩文是否真的能够正确读取。
创建工作目录
创建 /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 中说明有哪些差异。必须包含环境变量名称、原始文件的编码名称和所应用的权限数字。
写明三项差异:变量名称、原始文件的编码名称以及所应用的权限数字。