Linux Shell 在运维中的经验总结

1、shell编写规范
1)脚本开头部分应有脚本功能说明、参数使用说明、做者姓名、建立/修改日期、版本信息,格式为:
Linux Shell 在运维中的经验总结
2)脚本编写时,注意格式对齐,如全部的循环或者判断语句先后的语句进行对齐,以及case的选取彻底,如:
Linux Shell 在运维中的经验总结
3)脚本开头执行时,执行以下命令,在执行过程当中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出:
Linux Shell 在运维中的经验总结
4)建议将命令行的每一个参数放在单引号、双引号中,特别是rm、mv等可能对生产现有数据形成修改的操做,建议使用垃圾箱策略:rm操做转义为mv操做,制定文件保存目录,以防回退,并按期清理:
Linux Shell 在运维中的经验总结
5)命令行中参数须要使用‘’、‘?’通配符的,应依据最精确匹配原则,如能肯定文件、目录名称的前缀、后缀、扩展名及其余可识别关键字的,须在参数中包含该信息,如能肯定文件、目录的长度应使用‘?’通配符,不得使用‘’,推荐的使用方式:
Linux Shell 在运维中的经验总结
不推荐使用的方式:
Linux Shell 在运维中的经验总结shell

禁止使用的方式:
Linux Shell 在运维中的经验总结
6)给数值型变量的赋值后,须要手工保证变量的值为数值型,避免在后续的处理中出现异常:
Linux Shell 在运维中的经验总结
7)在判断条件中使用的变量,必须包含在双引号中,如:
Linux Shell 在运维中的经验总结
禁止使用的方式:
Linux Shell 在运维中的经验总结
Linux Shell 在运维中的经验总结
8)对文件进行打包备份时,必须使用相对路径进行打包,如:
Linux Shell 在运维中的经验总结
9)对于打包后还需进行压缩的文件,建议使用管道进行处理,如:
Linux Shell 在运维中的经验总结
不建议两部分分开执行:
Linux Shell 在运维中的经验总结
10)使用ps命令筛选进程时,如能肯定进程所属用户,必须在参数中指定用户名称,如其输出做为kill命令的输入,则必须指定进程所属用户,如:
Linux Shell 在运维中的经验总结
2、易错类型shell编写
1)更新文件使用>不用cp
使用>修改和回退文件时,保留原文件的属组和权限,避免使用cp时权限属组被修改。
Linux Shell 在运维中的经验总结
2)使用kill前确认
关键字用-w 精确匹配字段;
kill先后都保留现场, 两次ps -ef|grep -w 关键字|grep -v grep >>/tmp/kill进程名.backup;
删除前要校验,获取进程号是否惟一,避免多杀或误杀的状况。
Linux Shell 在运维中的经验总结
3)使用rm前确认
删除前备份删除对象信息,避免使用变量,直接使用文件和目录名;
若是必须使用时,删除前,建议检查避免误删,删除目录和文件信息保留:
Linux Shell 在运维中的经验总结
建议禁用find遍历根目录进行查找,同时删除前进行确认,避免多删或误删的状况。
4)For循环的坑
for循环的in条件按空格来区分,避免进入不正确或死循环。
Linux Shell 在运维中的经验总结
5)while循环的禁忌
若是还想使用循环中的变量,不要while结合管道使用。
Linux Shell 在运维中的经验总结
6)慎用cp
这句话基本上正确,但一样有空格分词的问题。因此应当用双引号:
Linux Shell 在运维中的经验总结
可是若是凑巧文件名以 - 开头,这个文件名会被 cp 看成命令行选项来处理。
能够试试下面这个:
Linux Shell 在运维中的经验总结
但也可能再碰上一个不支持 -- 选项的系统,因此最好用下面的方法:
Linux Shell 在运维中的经验总结
7)慎用cd
避免使用cd到操做目录再操做的方式,可能致使进入目录失败,误删除,如:
Linux Shell 在运维中的经验总结
建议以下:
Linux Shell 在运维中的经验总结
8) 用[[ ]]代替[ ]
Linux Shell 在运维中的经验总结
当$var为空时,上面的命令就变成了[ ="bar" ]
相似地,当$var包含空格时:
[ space words here = "var" ]二者都会出错。因此应当用双引号将变量括起来:
[ "$var" = var ] 几乎完美了。
可是,当$var以 - 开头时依然会有问题。在较新的bash中你能够用下面的方法来代替,[[ ]]关键字能正确处理空白、空格、带横线等问题。
Linux Shell 在运维中的经验总结
另注意,[[适用于字符串,若是是数值,要用如:(( $var > 8 ))安全

9)管道操做中不要同时读写文件
Linux Shell 在运维中的经验总结
你不能在同一条管道操做中同时读写一个文件。根据管道的实现方式,file要么被截断成0字节,要么会无限增加直到填满整个硬盘。若是想改变原文件的内容,只能先将输出写到临时文件中再用mv命令。
Linux Shell 在运维中的经验总结
10)cd的易错问题
cd 有可能会出错,致使要执行的命令就会在你预想不到的目录里执行了。因此必定要记得判断cd的返回值。
Linux Shell 在运维中的经验总结
若是你要根据cd的返回值执行多条命令,能够用 ||。
Linux Shell 在运维中的经验总结
关于目录的一点题外话,假设你要在shell程序中频繁变换工做目录,以下面的代码:
Linux Shell 在运维中的经验总结
不如这样写:
Linux Shell 在运维中的经验总结
括号会强制启动一个子shell,这样在这个子shell中改变工做目录不会影响父shell(执行这个脚本的shell),就能够省掉cd - 的麻烦。bash

3、应用类编写
目前行里自动化工具愈来愈多,不管是应用的MAOP或系统的SMDB,自动化实现都仍是平常运维脚本的调用,结合平常运维的一些经验,脚本中就更须要考虑周全和控制风险。这里介绍一些结合运维场景的脚本应用,但愿规避之前犯过的错,重点在控制风险。
1) 支持交互式脚本的应用
不少脚本中须要进行交互,在规避风险的同时,须要经过自动化工具发布来支持交互,可使用expect,示例以下:
Linux Shell 在运维中的经验总结
也可使用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)脚本规范执行和日志追溯
直接执行的脚本很危险,要提示用户如何使用脚本,并记录日志以便跟踪。
示例以下:
Linux Shell 在运维中的经验总结
3)脚本的并发锁控制
避免多人同时执行或并发同时执行的异常问题,建议增长锁机制,示例以下:
Linux Shell 在运维中的经验总结
4)控制脚本不退出的风险
周期频繁执行的脚本,须要防止脚本hang住不退出,致使后续脚本再次执行。
Linux Shell 在运维中的经验总结
5)避免集中发布脚本形成的风险
使用ftp、sftp传输、下载文件,或者集中访问存储端口时,尽可能增长发布对象散列,避免集中操做形成存储端口拥堵,跨防火墙流量超限报警等影响。
Linux Shell 在运维中的经验总结微信

6)避免文件无限增加的风险
向一个文件中追加数据时,必定要设置阀值,必要时清空,避免文件无限增大:
Linux Shell 在运维中的经验总结
目录增长清理过时文件策略,避免产生的文件愈来愈多,形成文件节点用尽:
Linux Shell 在运维中的经验总结
目录中的文件过多,会报参数太长错误没法删除,建议放在循环中遍历删除:
Linux Shell 在运维中的经验总结并发

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

  1. 经过规范类脚本的定义,标准常量定义、清晰的注释、函数和变量大小写用法,细节中能够看出严谨,即便只有几行,也能体现出一名优秀脚本开发人员的素质。
  2. 经过易错类脚本中的“坑”,使得 shell面向过程的编写更驾轻就熟,让脚本规范的同时,逻辑也更严谨清晰,避免了错误,也提升了脚本的开发效率。
  3. 经过运维场景的脚本应用,规避各类开发和执行过程当中的风险,使得shell脚本不只能支持自动化发布,更能够全面智能化的为运维服务。

本文转载微信公众号地址:运维curl

相关文章
相关标签/搜索