Teknologian jakaminen

Centos-ympäristön käynnistys/uudelleenkäynnistys java-palvelun komentosarjan optimointi

2024-07-12

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

johtaa

Useista offline-ympäristössä käyttöönotetuista Java-sovelluksista koostuva järjestelmä on julkaistava useammin testausvaiheen aikana Resurssirajoitusten vuoksi siinä ei ole devopsia tai CICD-sarjaa, joten se pakataan purkkiin julkaisua varten. Käytin käynnistämiseen komentosarjaa Ennen kuin aloitan, minun on lopetettava prosessi vastaanotetun portin mukaan, muuten tulee porttiristiriita ja käynnistys epäonnistuu. Etsi automaattisesti vastaava prosessi ja lopeta ja käynnistä se uudelleen. Toinen asia on lokitiedosto Uudelleenkäynnistyksen jälkeen luodaan uusi lokitiedosto palvelun nimen ja nykyisen ajan perusteella. Jos lokia kysytään, ne on valittava manuaalisesti. Ajattelin arkistoida historialliset lokitiedostot polun alla olevaan varmuuskopiokansioon.

Osittainen komennon kuvaus

Ensinnäkin haluan todeta, että olen aloittelija ja käytän tätä aluetta vähän.

Kyselypalveluprosessi portin perusteella

Käytän mieluummin lsof-komentoa. Voit esimerkiksi tehdä kyselyn portin 8080 käyttämistä prosesseista käyttämällä seuraavaa komentoa.

lsof -i:8080
  • 1

tappamisprosessi

Sinun kaikkien pitäisi tietää tämä, tappaa -9, älä vain käytä tappaa, esimerkiksi lopeta prosessi prosessilla PID 12345.

kill -9 12345
  • 1

Funktiokirjoitus vastaanottaa parametrit

Tämä on suhteellisen yksinkertainen komento, ja funktion parametreja käytetään sen mukaisesti.$1,$2,$3…saada

käsikirjoitus

Koska Java-palveluita on useita ja pitäen kiinni myös uudelleenkäytön ideasta, ajattelin kirjoittaa yleisen menetelmän palvelun käynnistämiseksi uudelleen ja sitten kirjoittaa useita palveluita vastaavia komentosarjoja niiden palvelujen nimet, portit ja muut tiedot tallentamiseksi. Palveluiden vastaavissa skripteissä Keskipassin parametri kutsuu yleistä palvelun käynnistys- tai uudelleenkäynnistysmenetelmää.

Yleisen palvelun käynnistys- tai uudelleenkäynnistyskomentosarja 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

Yhden palvelun käynnistysskripti

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

Ilmoitus

Uudelleenkäynnistää

Jos palvelun käynnistysskripti suoritetaan suoraan ilman parametrien välittämistä, se arvioi, onko palveluportti varattu, jos se on varattu, se poistuu suoraan palvelu on alkanut.

Asiakirjan sijainti

Jar-paketti sijaitsee /opt/app-hakemistossa, komentosarja sijaitsee /opt/app/run-hakemistossa ja loki on sijoitettu /opt/app/logs-hakemistoon. Tällä hetkellä tämä versio tukee vain suoritusta skriptin nykyisessä hakemistossa. Jos käytetään absoluuttista polkua, menetelmä ilmoittaa virheestä, joka voi johtua siitä, että skriptin kirjoitusmenetelmät eivät käytä absoluuttisia polkuja. Jokaisella on omat hyvät ja huonot puolensa ratkaisu toistaiseksi.

epänormaalia

Testauksen aikana havaitturun.sh: xxx行 $'r' 附近有语法错误virhe, käytä sed -i 's/r$//' run.sh -komentoa sen muuntamiseen.