Partage de technologie

Optimisation du script de service Java de démarrage/redémarrage de l'environnement Centos

2024-07-12

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

plomb

Un système composé de plusieurs applications Java déployées dans un environnement hors ligne doit être publié plus fréquemment pendant la phase de test. En raison de contraintes de ressources, il n'y a pas de développement ou de CICD, il est donc simplement emballé dans un fichier jar pour la publication. J'ai déjà utilisé un script pour démarrer. Avant de commencer, je dois tuer le processus en fonction du port reçu, sinon il y aura un conflit de port et le démarrage échouera. L'un des points d'optimisation est de prendre en charge le redémarrage automatique du script, trouvez automatiquement le processus correspondant, puis tuez et redémarrez. Un autre point est le fichier journal. Après le redémarrage, un nouveau fichier journal sera généré en fonction du nom du service et de l'heure actuelle. Lors de l'interrogation du journal, s'il existe des fichiers avec plusieurs préfixes, vous devez les sélectionner manuellement, ce qui est gênant. . J'ai pensé à archiver les fichiers journaux historiques dans le dossier de sauvegarde actuel sous le chemin.

Description partielle de la commande

Tout d’abord, je tiens à préciser que je suis un novice en shell et que j’utilise peu ce domaine.

Processus de service de requête basé sur le port

Je préfère utiliser la commande lsof pour cela. Par exemple, pour interroger les processus occupés par le port 8080, vous pouvez utiliser la commande suivante.

lsof -i:8080
  • 1

tuer le processus

Vous devriez tous le savoir, kill -9, n'utilisez pas simplement kill, par exemple, tuez le processus avec le processus PID 12345.

kill -9 12345
  • 1

Le script de fonction reçoit les paramètres

Il s'agit d'une commande relativement simple et les paramètres de la fonction sont utilisés en conséquence.$1,$2,$3…recevoir

scénario

Parce qu'il existe plusieurs services Java, et adhérant également à l'idée de réutilisation, j'ai pensé à écrire une méthode commune pour redémarrer le service, puis à écrire des scripts correspondant à plusieurs services pour enregistrer leurs noms de service, ports et autres informations respectifs. Dans les scripts respectifs des services, le paramètre middle pass appelle la méthode commune de démarrage ou de redémarrage du service.

Démarrage du service commun ou script de redémarrage 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 démarrage d'un service unique

#!/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

Avis

Redémarrage

Si le script de démarrage du service est directement exécuté sans transmettre de paramètres, il sera jugé si le port de service est occupé, s'il est occupé, il se terminera directement. Si le redémarrage est réussi, le processus de service d'origine sera tué puis redémarré. le service est démarré.

Emplacement des documents

Le package jar se trouve dans le répertoire /opt/app, le script se trouve dans le répertoire /opt/app/run et le journal est placé dans le répertoire /opt/app/logs Actuellement, cette version ne peut prendre en charge que l'exécution. dans le répertoire courant du script. Si un chemin absolu est utilisé La méthode signalera une erreur, qui peut être causée par certaines méthodes d'écriture dans le script n'utilisant pas de chemins absolus. Chacune a ses propres avantages et inconvénients, nous conserverons donc cela. solution pour l'instant.

anormal

Rencontré lors des testsrun.sh: xxx行 $'r' 附近有语法错误erreur, utilisez la commande sed -i 's/r$//' run.sh pour le convertir.