脚本的学习一直不得章法,以前都是囫囵吞枣式的学习,如今决定好好梳理下思路,看看究竟哪里是弱项。以前询问一个架构师大神,问shell脚本应该怎么学习,人家回答了句,shell很简单啊。如今想一想对于一个编程经验丰富的人来讲shell确实简单,从我在学校中对c和c++的认识,足以感知到。人的思惟必定是先由总体再到过程。对于一个程序的开发来讲,必定是先从总体逻辑框架再到具体细节处理。接下来我从一个脚本中去寻找个人知识的短板。java
题目要求:
在生产环境中,常常遇到tomcat没法完全关闭,也就是说用tomcat自带的shutdown.sh脚本没法将java进程彻底关掉。因此须要借助shell脚本,将进程杀死,而后再启动。
写个shell脚本,实现上述功能。备注:完全杀死一个进程的命令是kill -9 pidc++
题目分析:
1 题目要求脚本完成两个任务,关闭java进程和成功启动tomcat服务。因此它应该分为两部分:关闭和启动。就目前题目要求来讲,咱们只须要写stop和start两个函数,而后分别调用函数便可。若是咱们要将其作成一个/etc/init.d/ 下面的启动脚本。那么只须要再该脚本基础上加上case 结构,能够执行stop和start选项。若是还须要一个重启功能,那么再定义一个restart函数,restsat功能就是先stop再start。在case多加一个条件就能够。shell
2 过程当中须要注意的细节。 kill -9 杀进程比较危险有可能会致使一些数据丢失,尽可能少用。
3 启动后要检查是否启动成功,能够经过是否存在java进程来判断。编程
脚本的总体框架就是:vim
#!/bin/bash tomcatdir=/usr/local/tomcat stop() { } start() { } stop start
具体代码为tomcat
#!/bin/bash tomcatdir=/usr/local/tomcat //指定tomcat的安装路径 stop() { echo -n "stopping tomcat." killall java i=0 while [ $i -lt 10 ] do if pgrep -l java &> dev/null //pgrep -l 显示进程名及pid,有数据表示非空,为真。 then killall java sleep 1 echo -n "." //每尝试一次输出一个点,给出状态提示。 i=$[$i+1] else echo -e "\033[32m[0k]\033[0m" //输出绿色的带中括号的ok字符 break fi done //程序一进来先用killall尝试杀一遍进程,若是成功直接显示绿色字体的[ok]退出,若是失败,则再尝试10次。 if pgrep -l java &> /dev/null then pgrep java |xargs kill -9 &> /dev/null // xargs 表示对列出的每一个进程都杀一次 sleep 1 pgrep java |xargs kill -9 &> /dev/null fi if pgrep java &> /dev/null then echo "java 进程杀不掉,请检查" exit fi // 再次检查进程,若是还存在,用kill -9 强制杀,尝试两次。杀不死,输出提示信息。 } start() { cd $tomcatdir echo -n "starting tomcat." ./bin/startup.sh 2>/tmp/start_tomcat.log i=0 while [ $i -lt 3 ] do if ! pgrep java &> /dev/null then ./bin/startup.sh 2>/tmp/start_tomcat.log echo -n "." i=$[$i+1] else echo -e "\033[32m[0k]\033[0m" break fi done if ! pgrep java &> /dev/null then cat /tmp/start_tomcat.log echo "tomcat 没法启动,请检查。" fi } // 程序一进来先尝试启动一次,若是成功直接输出ok,若是还没找掉进程,则尝试三次。仍是失败的话,给出提示退出。 if ! rpm -q psmisc &> /dev/null then echo "安装psmic包。" yum install -y psmisc fi // 在调用函数以前,检查带有killall命令的包是否安装,没有使用yum安装。 stop start
封装为能够开机启动的脚本bash
vim /etc/init.d/tomcatd #!/bin/bash #chkconfig: 2345 80 20 ############################################################################# #this scripts is about tomcat start or stop ############################################################################# function usage(){ echo "$0 {start|stop|restart}" } if [ $# -ne 1 ];then usage exit 1 fi tomcatdir=/usr/local/tomcat start() { cd $tomcatdir echo -n "starting tomcat." ./bin/startup.sh 2>/tmp/start_tomcat.log i=0 while [ $i -lt 3 ] do if ! pgrep java &> /dev/null then ./bin/startup.sh 2>/tmp/start_tomcat.log echo -n "." i=$[$i+1] else echo -e "\033[32m[0k]\033[0m" break fi done if ! pgrep java &> /dev/null then cat /tmp/start_tomcat.log echo "tomcat 没法启动,请检查。" fi } stop() { echo -n "stopping tomcat." killall java i=0 while [ $i -lt 10 ] do if pgrep -l java &> dev/null then killall java sleep 1 echo -n "." i=$[$i+1] else echo -e "\033[32m[0k]\033[0m" break fi done if pgrep -l java &> /dev/null then pgrep java |xargs kill -9 &> /dev/null sleep 1 pgrep java |xargs kill -9 &> /dev/null fi if pgrep java &> /dev/null then echo "java 进程杀不掉,请检查" exit fi } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restat ;; esac