简洁的脚本编写规范

脚本健壮性是脚本设计考虑的重要因素。很多脚本编写时只考虑到一些正常执行路径,里面各种条件都满足的情况下,脚本能正常执行。条件不满足时,容易出错,导致故障

脚本设计应该是一个闭环,从开始执行到最终执行完成是可预期的。脚本依赖的条件,执行时会进行检测,不满足则抛异常,脚本执行的结果应该返回正确的状态,执行出错时有通知机制

基本规范

脚本编写需要遵循以下基本的规范

  1. 脚本风格:在编写脚本时,应有良好的系统化和结构化的风格,增加脚本的美观以及可读性。可参考Google脚本风格指南
  2. USAGE函数:脚本需要包含USAGE函数,告知脚本使用方法,应包含输入、输出、功能、外部依赖、环境变量等,便于用户使用
  3. 用户检查:当脚本只能在特定用户下执行时务必加上用户检查
  4. 绝对路径:脚本中推荐使用绝对路径,如必须在特定目录下执行,则脚本中应先切换到该目录下
  5. 重复执行:脚本设计时,尽量设计成可重复执行,并确保重复执行的结果是幂等
  6. 单例执行:如果脚本同时只能执行一次,应通过文件锁或进程检查等方式进行校验
  7. 异常处理:脚本执行出错,应抛出错误,同时设置正确退出值,0为正常,非0为异常,任务系统会根据退出值来判断脚本执行结果,Ansible、Jenkins、Rundeck等也是同样的设计
  8. 日志记录:编写脚本的过程中应添加日志,例如执行步骤、错误信息等,方便追踪执行过程及排错

最佳实践

根据对之前脚本执行失败问题的汇总分析,以下问题需要特别注意

  1. 添加脚本使用方法

脚本开头需要添加脚本的使用方法,使用方法需明确脚本是否接收参数,对于一些有参数的脚本,需在使用方法中描述参数的含义,同时需要判断传入的参数数量是否一致,一个好的使用方法编写如下

if [ $# != 3 ];then
    echo "USAGE: $0 PROJ ENVT TAG"
    exit 1
fi

使用方法应位于脚本开头位置

  1. 提前创建文件夹

当需要在特定文件夹下进行操作时,需要先检查文件夹是否存在,若不存在请提前创建,例如

if [ ! -d /tmp/ops-coffee/ ];then
    mkdir /tmp/ops-coffee/
fi

cd /tmp/ops-coffee/ &&\
echo "tmp file." > dena.txt
  1. 校验命令执行结果

脚本是由若干命令组成的,脚本编写时应确保每一条命令都符合预期,在脚本中推荐使用&&||运算符

ps -ef | grep java | grep -v grep | wc -l &&\
echo 0 ||\
echo 1
  1. 返回正确的状态

在命令执行完成后,会根据命令的返回状态也就是$?的值来判断命令是否执行成功,当$?0时表示执行成功,否则表示执行失败,如果是执行的脚本时,需要在脚本最后明确脚本返回状态,shell脚本可以在脚本执行成功时通过exit指定退出状态,例如

ls /ops-coffee.cn &&\
exit 0 ||\
exit 1

而对于python脚本则可以借助sys.exit这样写

import sys

if 'www' in 'ops-coffee.cn':
  sys.exit(0)
else:
  sys.exit(1)

其他语言类似

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/8008

(0)
郭靖的头像郭靖
上一篇 2023年4月18日 下午4:11
下一篇 2023年4月19日 下午5:09

相关推荐

  • MySQL数据库数据对比工具——Mysqldbcompare

    MySQL Utilities介绍 MySQL Utilities 提供一组命令行工具用于维护和管理 MySQL 服务器,包括: 管理工具 (克隆、复制、比较、差异、导出、导入) 复制工具 (安装、配置) 一般工具 (磁盘使用情况、冗余索引、搜索元数据) MySQL Utilities是一系列的命令行工具以及python库更容易完成管理的任务。库是用Pyth…

    2023年5月4日
    1.7K00
  • 一个由MySQL安全插件引发的生产问题

    一、背景 生产环境下遇到一个问题,有数据库节点的连接数略高,触发了连接数告警。登录上查看后,发现实际业务压力不大。查看processlist发现有大量状态为“Waiting in connection_control plugin”的等待连接。 mysql> select ID,HOST,DB,COMMAND,TIME,STATE,INFO from …

    2023年3月6日
    1.0K00
  • Docker部署MinIO对象存储服务器结合Cpolar实现远程访问

    前言MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼容Amazon S3 API,因此可以与现有的S3工具和库无缝集成。MinIO的设计目标是高性能、高可用性和可扩展性。它可以在分布式模式下运行,以满足不同规模的存储需求。 MinIO是一个开源的软件,可以免费使用,还可以在普通硬件上运行…

    2023年12月20日
    1.1K00
  • Word找回没有保存的文件方法

      1、“不保存”找回文件。   当我们关闭文档时,会提示,是否保存,如果点错了,直接点击“不保存”,咋办?   再次启动 Word,进入「打开」,选择右侧的「恢复未保存的文档」,在这里,我们可以看到许多文件,这些文件全部都是点击了“不保存”,没有保存下来的文件,找到我们需要的文件,然后“打开”即可。   2、死机、断电等导致文件丢失。   如果你正在使用 …

    2024年6月17日
    1.2K00
  • CentOS7下使用Lsyncd实现文件实时同步

    Lsyncd 在几秒钟内将这些文件事件整理核对后,然后生成一个或多个进程以将更改同步到远程文件系统。默认使用的同步方法是rsync。因此,Lsyncd 是一种轻量级的实时镜像解决方案。 Lsyncd简单介绍 Lsyncd 使用文件系统事件接口(inotify 或 fsevents)来监视本地文件和目录的更改。 Lsyncd 在几秒钟内将这些文件事件…

    2023年12月7日
    1.1K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信