AI智能
改变未来

shell脚本启动/停止/重启/查看java -jar程序


应用背景

希望通过shell脚本去灵活地启动,关闭,重启jar包程序,且可以查看当前程序运行状态。这样可以提高运维效率,便于管理。

如执行如下命令,启动java程序:

sh /home/zzworld/software_rel/softexe/javaweb_bin/start_java_test-web-all.sh start

shell脚本代码

#!/bin/bash#description: 启动重启server服务#获取时间: yyyy-mm-ddday_id=$(date \'+%Y-%m-%d\')#应用名称,根据此名称确定PIDexe_name=\'test-web-all.jar\'#环境env_the=\'prod\'#应用所在目录HOME=\'/home/zzworld/software_rel/softexe/javaweb\'#log日志log_name=${exe_name%.*}log_dir=\"/home/zzworld/software_rel/softexe/javaweb_log/${log_name}/zz_${log_name}_${day_id}.log\"#查询应用pid,(ps是进程状态信息)pid=`ps -elf |grep $exe_name|grep -v grep |head -n 1 |awk \'{printf $4}\'`#通过pid获取端口号,(netstat,是网络连接相关信息,如套接字,端口,pid/应用名,等等)port=`netstat -anopt |grep $pid|head -n 1|awk \'{printf $4}\'|cut -d: -f4`start(){if [ -n \"$pid\" ];thenecho \"server already start,pid:$pid\"return 0fi#进入命令所在目录echo \"jar:$HOME/$exe_name ; log: $log_dir\"cd $HOMEnohup java -jar $HOME/$exe_name --spring.profiles.active=$env_the >> $log_dir 2>&1 &   #启动程序, 把日志输出到log_dir文件#查询应用pid,(ps是进程状态信息)pid=`ps -elf |grep ${exe_name}|grep -v grep |head -n 1 |awk \'{printf $4}\'`#sleep 15s#通过pid获取端口号,(netstat,是网络连接相关信息,如套接字,端口,pid/应用名,等等)port=`netstat -anopt |grep ${pid}|head -n 1|awk \'{printf $4}\'|cut -d: -f4`echo \"start at port:${port},pid:$pid\"}stop(){if [ -z \"$pid\" ]; thenecho \"not find program on port:$port\"return 0fi#结束程序,使用讯号2,如果不行可以尝试讯号9强制结束kill -9 $pidrm -rf $pidecho \"kill program use signal 2,pid:$pid\"}status(){if [ -z \"$pid\" ]; thenecho \"not find program on port:$port\"elseecho \"program is running,pid:$pid\"fi}case $1 instart)start;;stop)stop;;restart)$0 stopsleep 2$0 start;;status)status;;*)echo \"Usage: {start|stop|status}\";;esacexit 0

脚本说明

  • 先通过时间函数
    $(date \'+%Y-%m-%d\')

    获取当前日期day_id,从而输出启动日志到程序对应地日志文件。

  • 定义基础变量,如 脚本环境:env_the,根目录 home等等。
  • 获取当前程序的pid:
    ps -elf |grep $exe_name|grep -v grep |head -n 1 |awk \'{printf $4}\'

    (参考:ps -elf 查看进程获取进程id)

  • 获取程序启动后的端口:
    netstat -anopt |grep $pid|head -n 1|awk \'{printf $4}\'|cut -d: -f4

    (参考:netstat -anp |awk |cut 通过pid获取应用程序的端口号)

  • start()方法,表示启动,其中先判断pid不为空,之后执行
    nohup java -jar $HOME/$exe_name --spring.profiles.active=$env_the >> $log_dir 2>&1 &

    指令,
    $HOME表示引用变量值,–spring是传入程序的参数,>>是重定向追加输出内容到目录log_dir,

    2>$1

    意思是将

    2

    表示的错误流也定向到

    1

    对应的标准流中,最后一个

    $

    表示把该命令放到后台执行。

  • stop()方法是通过上述获取的pid去 kill 该程序。
  • status()方法是判断该程序是否执行。
  • 脚本
    case $1 in

    是switch选择函数,通过执行命令传入不同参数start,stop,status,restart来表示启动,停止,查询状态,重启。

  • 最后
    exit 0

    退出脚本

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » shell脚本启动/停止/重启/查看java -jar程序