生产运维脚本禁用print(),须用logging分级记录;cron中需用绝对路径、显式设环境变量并校验用户;argparse应强制必填、禁用敏感默认值、提供–dry-run;异常处理要捕获具体类型、确保资源清理、规范退出码。
为什么 print() 不该出现在生产运维脚本里
运维脚本一旦进入线上环境,print() 会直接混入标准输出,干扰管道操作(比如 grep、awk 或日志采集器),也容易掩盖真实错误。更糟的是,它无法分级控制——你没法只让“警告”显示而屏蔽“调试信息”。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 统一用
logging模块,初始化时配置level和format,例如%(asctime)s %(levelname)s %(name)s %(message)s - 避免在模块顶层调用
logging.basicConfig(),改用显式Logger实例,方便被主程序接管日志配置 - 关键路径(如服务启停、文件备份)必须打
logging.info();异常分支必须打logging.error()并附带exc_info=True - 调试信息用
logging.debug(),上线前通过环境变量(如LOG_LEVEL=WARNING)关闭
如何让脚本在 cron 和手动执行时行为一致
cron 环境缺失用户 shell 配置(~/.bashrc)、PATH 不完整、HOME 可能为 /,导致依赖环境变量或相对路径的脚本静默失败。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 所有路径用绝对路径:
/opt/myapp/config.yaml而非./config.yaml或~/config.yaml - 显式设置必要环境变量:在脚本开头加
os.environ["PATH"] = "/usr/local/bin:/usr/bin:/bin" - 用
os.path.expanduser()处理用户家目录,但不要依赖~字符串字面量 - 检查当前用户权限:用
os.getuid()+pwd.getpwuid()校验是否为预期用户,避免 cron 以 root 运行却误写入普通用户目录
argparse 怎么设计才不反人类
运维人员常批量调用脚本,参数混乱或提示不清会导致重复执行失败、误删数据。别把 argparse 当成“有就行”,得让它扛住真实场景。