通过 pid 杀死进程,然后重启服务(tomcat 重启)

本贴最后更新于 2672 天前,其中的信息可能已经时移世改

问题引出

tomcat 有自己的脚本(shutdown.sh),来关闭服务,但是当 tomcat 容器中的项目开启了其他的端口做相关逻辑操作时,tomcat 的关闭服务脚本就无能为力了,它只能关闭自己的端口

解决方案

  • 直接杀死进程

直接杀死进程会将其捆绑的所有服务停止掉,不管你这个进程上绑定了多少个端口

代码实践

  • 我们投产的服务器比较变态,不支持中文编码,所以只好双管齐下,中英结合了
  • 脚本中注释掉的代码部分为另一种从控制台接收参数的方式,不过考虑到时候不能每次都从控制台输入参数来执行重启(毕竟重启的可能是运维人员,为了避免不必要的麻烦,还是不要让他们手动输入了),所以改成了直接通过配置修改 TOMCAT_HOME 的方式
#!/bin/bash
## 执行脚本前,修改这个变量 (modify this variable before execute the shell script)
export TOMCAT_HOME=/opt/cim-tomcat-8080
#echo "-------Input process name first"
## 从控制台读取要杀的进程名(read the value from the console)
#read input1
## 获取pid (get the pid)
#PID=$(ps x|grep $input1|grep -v grep|awk '{printf $1}')
PID=$(ps x|grep $TOMCAT_HOME|grep -v grep|awk '{printf $1}')
  if [ $? -eq 0 ]; then
    echo "---------process id(进程id):$PID"
    echo "-------begin to kill the pid(开始杀进程)"
    kill -9 $PID
      if [ $? -eq 0 ];then
#        echo "----------kill $input1 success(成功杀死进程)"
  echo "----------kill $TOMCAT_HOME success(成功杀死进程)"
     else
       echo "----------kill $input1 fail(杀死进程失败,可能该进程不存在)"
fi
  else
## 实际测试:进程不存在时不会走这个else(in fact,this situation will not happen)
    echo "---------process $input1 not exit(该进程不存在)"
    exit
  fi
## 睡眠3秒,确保进程已停止(sleep 3s make sure the process has killed)
echo "-------wait for closing the tomcat(等待tomcat被关闭)"
sleep 3s

echo "-------begain to start the tomcat service (开始启动tomcat服务)"
$TOMCAT_HOME/bin/startup.sh && tail -f $TOMCAT_HOME/logs/catalina.out

效果图

  • 进程
    15 引用 • 4 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖 • 2 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...