2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
Ensinnäkin haluan todeta, että olen aloittelija ja käytän tätä aluetta vähän.
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
Sinun kaikkien pitäisi tietää tämä, tappaa -9, älä vain käytä tappaa, esimerkiksi lopeta prosessi prosessilla PID 12345.
kill -9 12345
Tämä on suhteellisen yksinkertainen komento, ja funktion parametreja käytetään sen mukaisesti.$1
,$2
,$3
…saada
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}"
}
Yhden palvelun käynnistysskripti
#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
# 执行通用服务脚本中的启动方法
start_app xxx.jar 8080 4096 ${action}
}
#程序主入口
start
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.
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.
Testauksen aikana havaitturun.sh: xxx行 $'r' 附近有语法错误
virhe, käytä sed -i 's/r$//' run.sh -komentoa sen muuntamiseen.