(一) shell 能做什么?
ok,shell无所不能!
在日常维护公司应用平台以及服务器过程中,经常会用shell来处理以下一些工作:
1. 自动化批量系统初始化程序(update 、软件安装、时区设置、安全策略...)
2. 自动化批量软件部署程序(LAMP、LNMP,Tomcat、LVS、Nginx)
3. 应用管理程序(KVM、集群管理扩容、MySQL)
4. 日志分析处理程序(PV、UV、top 100,grep/awk/sed)
5. 自动化备份恢复程序(MySQL完全备份/增量+Crond)
6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
9. 自动化扩容(增加云主机-业务上线)
eg: zabbix监控 CPU 80%+ |-50% Python API AWS/EC2 (增加/删除云主机)+Shell Script(业务上线)
另外shell还可以:
10. 打印(俄罗斯方块、 三角形、五角星、镂空五角星、圣诞树、小火车、坦克大战、排序算法...)
总之 shell 无所不能、关键是看业务需要。
那么相信大家都知道Python吧。不得不承认Python也很高效且容易上手。那么在日常运维中,用shell还是python呢?我个人认为你要是都会会更好!但是我觉得python更适合应用,和java差不多。shell更适合写脚本吧。比如你要写一个定时删文件的任务,用shell就是一个命令的事情,犯不着用python吧。
(二) 各编程语言执行方式及应用方向
那么还有其他语言呢,下面我们从程序的运行方式、应用方向来简述:
语种 执行方式
C 编译型语言 编译成 二进制机器码(CPU可直接执行的代码)
Java 编译型语言 解释器将java代码编译成 Jvm才认识的字节码在JVM上执行 如 Tomcat /Apache
shell 解释型语言 执行的时候由 bash 解释
perl 解释型语言 执行的时候由perl解释
expect 解释型语言 执行的时候由expect解释
Python 解释型语言 执行的时候由python解释
编译型语言 解释器将Python代码编译成 Python虚拟机(PVM)才认识的字节码在PVM上执行
解释型语言: 执行慢,修改灵活
编译型语言:一旦编译后执行快,但修改麻烦。每次修改都的重新编译。
以上呢,C比较适合写操作系统底层、java和python适合做应用。shell perl expect适合写脚本。
(三) Shell 和 Python的调用方式
shell和python都有专属的解释器,shell是bash(其实还有sh等很多)、python是python,都在linux的 /usr/bin/ 下面
那么,在什么地方指定脚本的专属解释器呢?以shell脚本为例:
1. 在脚本第一行 #!(shebang)后指定解释器。
2. 在调用脚本时,shell的三种调用方式
2-1) 指定解释器 bash a.sh , 此种方式会忽略脚本第一行shebang后的解释器,且不需要执行权限X
是将a.sh作为参数传给sh(bash)命令来执行的。不是a.sh自己来执行,而是被人家调用执行,所以不要执行权限。
2-2) 相对路径执行 ./a.sh , 此种方式会读取shebang指定的解释器,但需要执行权限X
不能直接 a.sh 来执行,会报错,未找到命令。
因为目前的工作目录 (/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中,加上路径后,表明执行的是这个文件。
2-3) 绝对路径执行 /home/hujianmei/a.sh ,此种方式会读取shebang指定的解释器,但需要执行权限X
2-4) shell环境执行 . ./a.sh 或 source ./a.sh 此种方式直接在当前shell进程执行,不会去读取shebang指定的解释器,且不需要执行权限X。 除2-4外,其余都是在子shell执行的哈~
如果不指定shebang,也不用解释器来调用,shell脚本也能执行成功。因为我们的工作环境本身就是一个shell,会被当成解释器。看吧,shell就是这么特殊。换作python肯定会报错的啦~
(四) 在Shell中调用Python
直接上代码:
bash01.sh
#!/usr/bin/bash
ping -c1 www.baidu.con &>/dev/null && echo "www.baidu.com is up" || echo "www.baidu.com is down"
/usr/bin/python <<-EOF
print "hello world"
EOF
echo "Hello bash"
说明: 在shell中可将 python代码快通过EOF的方式交给python这个解释器来执行。
EOF代码块只能存在于shell脚本。且前面那个 - 是为了解决结尾那个EOF标记可以缩进的。如果第一个EOF没有 - ,那么结尾那个EOF必须置顶哦~
还有那个 EOF 你可以替换成任意关键字,如HUJIANMEI 也是可以的。但是为了规范,还是EOF吧!
以上四点就是今日所学! 20200211