无论是系统运维,还是应用运维,均可分为“纯手工”——> “脚本化”——> “自动化”——>“智能化”几个阶段,其中自动化阶段,主要是将一些重复性人工操作和运维经验封装为程序或脚本,一方面避免重复性操作及风险,另一方面提高执行效率。在自动化运维的转变过程中,经常使用的可能就是shell脚本了,今天主要分享下shell脚本开发在运维工作中的一些经验总结。
小脚本有大智慧,别小看几十行代码,夹杂着系统设计、代码规范和操作经验等等细节,在建设自动化运维的工作中,还是很值得我们研究学习的,下面总结这些也都是源于各位脚本达人和我们在自身工作中“遇到的坑”、“摔过的跟头”和“排过的雷”,与大家共享。

规范类Shell编写经验总结

这里主要介绍并参考我行已经形成的一些shell编写规范,编写时严格遵守这些规范,不仅使编写人受益,同时也能提高使用者的执行效率。
1)脚本开头部分应有脚本功能说明、参数使用说明、作者姓名、创建/修改日期、版本信息,格式为:

2)脚本编写时,注意格式对齐,如所有的循环或者判断语句前后的语句进行对齐,以及case的选取完全,如:

3)脚本开头执行时,执行如下命令,在执行过程中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出:

4)建议将命令行的每个参数放在单引号、双引号中,特别是rm、mv等可能对生产现有数据造成修改的操作,建议使用垃圾箱策略:rm操作转义为mv操作,制定文件保存目录,以防回退,并定期清理:

5)命令行中参数需要使用‘’、‘?’通配符的,应依据最精确匹配原则,如能确定文件、目录名称的前缀、后缀、扩展名及其他可识别关键字的,须在参数中包含该信息,如能确定文件、目录的长度应使用‘?’通配符,不得使用‘’,推荐的使用方式:

不推荐使用的方式:

禁止使用的方式:

6)给数值型变量的赋值后,需要手工保证变量的值为数值型,避免在后续的处理中出现异常:

7)在判断条件中使用的变量,必须包含在双引号中,如:

禁止使用的方式:

8)对文件进行打包备份时,必须使用相对路径进行打包,如:

严禁将全路径打入tar包, 如:

9)对于打包后还需进行压缩的文件,建议使用管道进行处理,如:

不建议两部分分开执行:

10)使用ps命令筛选进程时,如能确定进程所属用户,必须在参数中指定用户名称,如其输出作为kill命令的输入,则必须指定进程所属用户,如:

易错类Shell编写经验总结

这里介绍的主要是日常shell编写中遇到比较隐蔽或看似简单,却难以发现的“坑”,编写中应尽量避免使用,使用更优的方法避免重蹈覆辙。
1)更新文件使用>不用cp
使用>修改和回退文件时,保留原文件的属组和权限,避免使用cp时权限属组被修改。

2)使用kill前确认
关键字用-w 精确匹配字段;
kill前后都保留现场, 两次ps -ef|grep -w 关键字|grep -v grep >>/tmp/kill_进程名_.backup;
删除前要校验,获取进程号是否唯一,避免多杀或误杀的情况。

3)使用rm前确认
删除前备份删除对象信息,避免使用变量,直接使用文件和目录名;
如果必须使用时,删除前,建议检查避免误删,删除目录和文件信息保留:

建议禁用find遍历根目录进行查找,同时删除前进行确认,避免多删或误删的情况。
4)For循环的坑
for循环的in条件按空格来区分,避免进入不正确或死循环。

5)while循环的禁忌
如果还想使用循环中的变量,不要while结合管道使用。

6)慎用cp
这句话基本上正确,但同样有空格分词的问题。所以应当用双引号:

但是如果凑巧文件名以 - 开头,这个文件名会被 cp 当作命令行选项来处理。
可以试试下面这个:

但也可能再碰上一个不支持 – 选项的系统,所以最好用下面的方法:

7)慎用cd
避免使用cd到操作目录再操作的方式,可能导致进入目录失败,误删除,如:

建议如下:

8) 用[[ ]]代替[ ]

当var为空时,上面的命令就变成了[="bar"]类似地,当var为空时,上面的命令就变成了[ ="bar" ] 类似地,当var为空时,上面的命令就变成了[="bar"]类似地,当var包含空格时:
[ space words here = “var” ]两者都会出错。所以应当用双引号将变量括起来:
[ "var"=var]几乎完美了。但是,当var" = var ] 几乎完美了。 但是,当var"=var]几乎完美了。但是,当var以 - 开头时依然会有问题。在较新的bash中你可以用下面的方法来代替,[[ ]]关键字能正确处理空白、空格、带横线等问题。

另注意,[[适用于字符串,如果是数值,要用如:(( $var > 8 ))

9)管道操作中不要同时读写文件

你不能在同一条管道操作中同时读写一个文件。根据管道的实现方式,file要么被截断成0字节,要么会无限增长直到填满整个硬盘。如果想改变原文件的内容,只能先将输出写到临时文件中再用mv命令。

10)cd的易错问题
cd 有可能会出错,导致要执行的命令就会在你预想不到的目录里执行了。所以一定要记得判断cd的返回值。

如果你要根据cd的返回值执行多条命令,可以用 ||。

关于目录的一点题外话,假设你要在shell程序中频繁变换工作目录,如下面的代码:

不如这样写:

括号会强制启动一个子shell,这样在这个子shell中改变工作目录不会影响父shell(执行这个脚本的shell),就可以省掉cd - 的麻烦。

应用类Shell编写经验总结

目前行里自动化工具越来越多,无论是应用的MAOP或系统的SMDB,自动化实现都还是日常运维脚本的调用,结合日常运维的一些经验,脚本中就更需要考虑周全和控制风险。这里介绍一些结合运维场景的脚本应用,希望规避以前犯过的错,重点在控制风险。
1) 支持交互式脚本的应用
很多脚本中需要进行交互,在规避风险的同时,需要通过自动化工具发布来支持交互,可以使用expect,示例如下:

也可以使用curl工具来替代简单的交互:
#FTP SFTP下载

curl-u ftpuser:ftppassword -O "sftp://ftp_ip:ftp_port/pathfile"

#FTP SFTP上传

curl-u ftpuser:ftppassword  --ftp-create-dirs-T upfile "sftp://ftp_ip:ftp_port/filepath/upfile"

2)脚本规范执行和日志追溯
直接执行的脚本很危险,要提示用户如何使用脚本,并记录日志以便跟踪。
示例如下:

3)脚本的并发锁控制
避免多人同时执行或并发同时执行的异常问题,建议增加锁机制,示例如下:

4)控制脚本不退出的风险
周期频繁执行的脚本,需要防止脚本hang住不退出,导致后续脚本再次执行。

5)避免集中发布脚本造成的风险
使用ftp、sftp传输、下载文件,或者集中访问存储端口时,尽量增加发布对象散列,避免集中操作造成存储端口拥堵,跨防火墙流量超限报警等影响。

6)避免文件无限增长的风险
向一个文件中追加数据时,一定要设置阀值,必要时清空,避免文件无限增大:

目录增加清理过期文件策略,避免产生的文件越来越多,造成文件节点用尽:

目录中的文件过多,会报参数太长错误无法删除,建议放在循环中遍历删除:

总结:
鉴于以上脚本,我们可以从中汲取一些经验,规避一些风险:
通过增加日志记录输出和脚本执行的方法说明,并自动交互和传递参数,避免执行脚本的操作风险;利用文件锁机制和运维中一些规避风险的方法,使得脚本自动执行起来更便捷更安全。

  1. 通过规范类脚本的定义,标准常量定义、清晰的注释、函数和变量大小写用法,细节中可以看出严谨,即使只有几行,也能体现出一名优秀脚本开发人员的素质。
  2. 通过易错类脚本中的“坑”,使得 shell面向过程的编写更得心应手,让脚本规范的同时,逻辑也更严谨清晰,避免了错误,也提高了脚本的开发效率。
  3. 通过运维场景的脚本应用,规避各种开发和执行过程中的风险,使得shell脚本不仅能支持自动化发布,更可以全面智能化的为运维服务。
    通过学习别人优秀的脚本,不断吸取经验,拓宽运维脚本的开发思路。虽然你现在还不是shell专家,但是想成为shell专家关键在于能否将日常经验及时进行总结和思考,并用创造性的思维去解决问题,不断积累!不断提高!大家共勉!

Linux Shell 在运维中的经验总结相关推荐

  1. linux云自动化运维,Liunx运维一线大神亲授 全新Linux云计算运维基础与Linux Shell自动化运维实战课程...

    Liunx运维一线大神亲授 全新Linux云计算运维基础与Linux Shell自动化运维实战课程 全新Linux云计算运维基础与Linux Shell自动化运维实战课程,由于国内一线大神亲自授课与教 ...

  2. Shell 开发在运维中的经验总结

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 无论是系统运维,还是应用运维,均可分为"纯手工" ...

  3. 如何做好python自动化运维,python在运维中的应用

    这篇文章主要介绍了一个有趣的事情,具有一定借鉴价值,需要的朋友可以参考下.希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下. 1.如何做好python自动化运维 随着移动互联网的普及, ...

  4. Linux线上运维经验分享与故障排除技巧-高俊峰-专题视频课程

    Linux线上运维经验分享与故障排除技巧-743人已学习 课程介绍         主要介绍Linux线上服务器的运维经验和实战操作过程,并介绍常见的系统故障排查思路与问题解决技巧. 课程收益     ...

  5. Linux云自动化运维第六课

    Linux云自动化运维第六课 第九单元  openssh-server 一.openssh-server 功能:让远程主机可以通过网络访问sshd服务,开始一个安全shell 二.客户端连接方式 ss ...

  6. 力作推荐!!!!   防线:企业Linux安全运维理念和实战(向世界500强企业学习Linux安全管理与运维之道)...

    防线:企业Linux安全运维理念和实战(向世界500强企业学习Linux安全管理与运维之道)      新书发售 http://product.dangdang.com/product.aspx?pr ...

  7. Linux 系统日常运维九大技能和运维网络知识总结

    一.Linux 系统日常运维九大技能 1.安装部署 方式:U盘,光盘和网络安装 其中网络安装已经成为了目前批量部署的首选方式:主要工具有Cobbler和PXE+kickstart 可以参考如下链接内容 ...

  8. [10] Linux系统日常运维

    [10] Linux系统日常运维 10.1 使用w查看系统负载 [root@Temence ~]# w19:28:05 up 45 days, 9:20, 1 user, load average: ...

  9. 第一节---shell与运维

    第一节-shell与运维 shell简述 本课程使用的bash,当然还有dash.zash等等,但是bash是大多数Linux系统的默认shell环境,因此本书以bash为主,另外bash也分为不同的 ...

最新文章

  1. mysql密码高级_MySQL数据库高级操作(图文详解)
  2. 江苏关于领取软考2021年上半年合格证书的通知
  3. mxnet基础到提高(11)--循环
  4. appium+python环境搭建_想学习自动化测试,已经学习了appium+python环境搭建和python的简单内容,下面该怎么做?...
  5. 说下我自己对空号检测的理解跟心得
  6. 【Python】判断多边形的形状为凸多边形还是凹多边形
  7. 土建中级工程师考试用书电子版_真的!2020年湖南土建中级职称考试用书是没有指定的教材?...
  8. Matlab 数据类型
  9. java token 生成_生成 Token
  10. click option/argument参数详解(click.option()和click.argument())
  11. 小朋友把游戏藏在计算机里,给两、三岁宝宝的60个超简单家庭早教游戏
  12. C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
  13. 搜狗都上市了,王小川还是单身,难道要找AI当女朋友?
  14. html th中加斜杠,vue element 表头添加斜线
  15. 【转】使用matlab软件打开一幅图片并且分别提取其中的RGB分量并显示
  16. 分布式事务实现原理【BAT 面试题宝库附详尽答案解析】
  17. 碳中和背景下中国煤炭行业供需规模及投资战略研究分析报告2022-2028年版
  18. 基于Python的Django框架的二手物品交易平台的设计与实现
  19. 清北学堂2019NOIP提高储备营DAY1
  20. “乐疯”挑战“爱疯”,比比谁锋

热门文章

  1. cannot be null mysql_mysql5.7 column cannot be null-阿里云开发者社区
  2. 2021陆川高考成绩查询,陆川中考成绩查询2021
  3. mysql not null 索引_MySQL中 IS NULL、IS NOT NULL、!= 能用上索引吗?
  4. 美团 -python
  5. 创新方法(TRIZ)理论及应用(一)
  6. VS 2012 单元测试简单配置
  7. 和孩子们一起学Python编程
  8. 用友CDM系统期初导入商品资料经验
  9. 股票软件开发中全推与点播的区别
  10. C语言与JAVA内存管理_C语言动态内存管理和动态内存分配