Compartir tecnología

Optimización del script del servicio Java de inicio/reinicio del entorno Centos

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

dirigir

Un sistema compuesto por múltiples aplicaciones Java implementadas en un entorno fuera de línea debe lanzarse con más frecuencia durante la fase de prueba. Debido a limitaciones de recursos, no hay devops ni CICD configurados, por lo que simplemente se empaqueta en un jar para su lanzamiento. Usé un script para comenzar antes. Antes de comenzar, necesito finalizar el proceso de acuerdo con el puerto recibido; de lo contrario, habrá un conflicto de puerto y el inicio fallará. Uno de los puntos de optimización es admitir el reinicio automático del script. encuentre automáticamente el proceso correspondiente y luego finalice y reinicie. Otro punto es el archivo de registro. Después de reiniciar, se generará un nuevo archivo de registro según el nombre del servicio y la hora actual. Al consultar el registro, si hay archivos con varios prefijos, debe seleccionarlos manualmente, lo cual es problemático. Pensé en archivar los archivos de registro históricos en la carpeta de respaldo actual en la ruta.

Descripción del comando parcial

En primer lugar, me gustaría decir que soy un novato y tengo poco uso de esta área.

Proceso de servicio de consulta basado en puerto.

Prefiero usar el comando lsof para esto. Por ejemplo, para consultar los procesos ocupados por el puerto 8080, puedes usar el siguiente comando.

lsof -i:8080
  • 1

proceso de matanza

Todos deberían saber esto, kill -9, no uses simplemente kill, por ejemplo, mata el proceso con el proceso PID 12345.

kill -9 12345
  • 1

El script de función recibe parámetros

Este es un comando relativamente simple y los parámetros de la función se utilizan en consecuencia.$1,$2,$3…para recibir

guion

Debido a que existen múltiples servicios Java y también me adhiero a la idea de reutilización, pensé en escribir un método común para reiniciar el servicio y luego escribir scripts correspondientes a múltiples servicios para registrar sus respectivos nombres de servicio, puertos y otra información. En los scripts respectivos de los servicios, el parámetro de paso medio llama al método de inicio o reinicio del servicio común.

Script de inicio o reinicio de servicios comunes run.sh

#!/bin/bash

start_app(){
  # 接收参数
  APP_NAME=$1;
  APP_PORT=$2;
  MEM=$3
  ACTION=$4;
  CURRENT_TIME=`date +"%Y%m%d%H%M%S"`
  
  #检查程序是否在运行
  APP_STATUS=`netstat -nlt|grep ${APP_PORT} |wc -l`;
  RUNNING_PID=$(netstat -nlp | grep :$APP_PORT | awk '{print $7}' | awk -F"/" '{ print $1 }');
  LOG_FILE=./logs/${APP_NAME}_${CURRENT_TIME}.log;
  cd ..;
  if [ "${APP_STATUS}" -eq 1 ]; then
    if [ "${ACTION}"x == "restart"x ]; then
      ## 重启前先kill原进程
      echo "kill the running app whose PID is ${RUNNING_PID} of ${APP_NAME}";
      kill -9 "${RUNNING_PID}";
      # 日志归档
      cd logs;
      for file in `ls ${APP_NAME}* -a`;
        do
          mv "${file}" backup/;
        done
      cd ..;
    else
      echo "exist running ${APP_NAME} and the PID is ${RUNNING_PID}";
      exit 0;
    fi
  fi
  echo "start ${APP_NAME} at $CURRENT_TIME";
  ## 启动程序
  nohup java -Xms${MEM}m -Xmx${MEM}m -XX:PermSize=256m -XX:MaxPermSize=512m -jar -Dfile.encoding=utf-8 -Dserver.port=${APP_PORT}  -Dspring.profiles.active=prod ${APP_NAME}  > ${LOG_FILE} 2>&1 &
  pid=`ps -ef|grep java|grep ${APP_NAME}`
  echo "${APP_NAME} has started successfully at ${CURRENT_TIME},and the pid is ${pid}"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

Script de inicio de servicio único

#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
	# 执行通用服务脚本中的启动方法
  start_app xxx.jar 8080 4096 ${action}
}
 
#程序主入口
start

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Aviso

Reanudar

Si ejecuta directamente el script de inicio del servicio sin pasar parámetros, determinará si el puerto del servicio está ocupado. Si está ocupado, saldrá directamente. Si se reinicia, el proceso de servicio original se finalizará y luego se reiniciará cuando el servicio. Está empezado.

Ubicación del documento

El paquete jar se encuentra en el directorio /opt/app, el script se encuentra en el directorio /opt/app/run y el registro se coloca en el directorio /opt/app/logs. Actualmente, esta versión solo admite la ejecución. en el directorio actual del script Si se usa una ruta absoluta El método informará un error, que puede deberse a que algunos métodos de escritura en el script no usan rutas absolutas. Cada uno tiene sus propias ventajas y desventajas, por lo que mantendremos esto. solución por ahora.

anormal

Encontrado durante las pruebasrun.sh: xxx行 $'r' 附近有语法错误error, utilice el comando sed -i 's/r$//' run.sh para convertirlo.