le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Un sistema composto da più applicazioni Java distribuite in un ambiente offline deve essere rilasciato più frequentemente durante la fase di test. A causa dei limiti delle risorse, non esiste un set devops o CICD, quindi viene semplicemente impacchettato in un jar per il rilascio. Prima di iniziare ho utilizzato uno script per avviare, devo terminare il processo in base alla porta ricevuta, altrimenti si verificherà un conflitto di porte e l'avvio fallirà. Uno dei punti di ottimizzazione è supportare il riavvio automatico dello script. trova automaticamente il processo corrispondente, quindi interrompi e riavvia. Un altro punto è il file di registro. Dopo il riavvio, verrà generato un nuovo file di registro in base al nome del servizio e all'ora corrente. Quando si interroga il registro, se sono presenti file con più prefissi, è necessario selezionarli manualmente, il che è problematico Ho pensato di archiviare i file di registro storici nella cartella di backup corrente sotto il percorso.
Prima di tutto, vorrei precisare che sono un principiante delle shell e conosco poco quest'area.
Preferisco usare il comando lsof per questo. Ad esempio, per interrogare i processi occupati dalla porta 8080, puoi usare il seguente comando
lsof -i:8080
Dovreste saperlo tutti, kill -9, non usare semplicemente kill, ad esempio, interrompi il processo con il processo PID 12345.
kill -9 12345
Questo è un comando relativamente semplice e i parametri della funzione vengono utilizzati di conseguenza.$1
,$2
,$3
…ricevere
Poiché esistono più servizi Java e aderendo anche all'idea del riutilizzo, ho pensato di scrivere un metodo comune per riavviare il servizio e quindi scrivere script corrispondenti a più servizi per registrare i rispettivi nomi di servizio, porte e altre informazioni. Nei rispettivi script dei servizi Il parametro middle pass richiama il metodo di avvio o riavvio del servizio comune.
Avvio del servizio comune o script di riavvio 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}"
}
Script di avvio del servizio singolo
#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
# 执行通用服务脚本中的启动方法
start_app xxx.jar 8080 4096 ${action}
}
#程序主入口
start
Se lo script di avvio del servizio viene eseguito direttamente senza passare parametri, verrà valutato se la porta del servizio è occupata. Se è occupata, uscirà direttamente. Se il riavvio viene superato, il processo del servizio originale verrà interrotto e quindi riavviato al termine il servizio è avviato.
Il pacchetto jar si trova nella directory /opt/app, lo script si trova nella directory /opt/app/run e il registro si trova nella directory /opt/app/logs Attualmente, questa versione può supportare solo l'esecuzione nella directory corrente dello script. Se viene utilizzato un percorso assoluto Il metodo riporterà un errore, che potrebbe essere causato da alcuni metodi di scrittura nello script che non utilizzano percorsi assoluti. Ognuno ha i suoi pro e contro, quindi lo manterremo soluzione per ora.
Incontrato durante i testrun.sh: xxx行 $'r' 附近有语法错误
errore, utilizzare il comando sed -i 's/r$//' run.sh per convertirlo.