2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Ein System, das aus mehreren Java-Anwendungen besteht, die in einer Offline-Umgebung bereitgestellt werden, muss während der Testphase häufiger veröffentlicht werden. Aufgrund von Ressourcenbeschränkungen gibt es keine Entwickler- oder CICD-Sets, daher wird es zur Veröffentlichung einfach in ein JAR gepackt. Ich habe zuvor ein Skript zum Starten verwendet, um den Prozess entsprechend dem empfangenen Port abzubrechen. Andernfalls kommt es zu einem Portkonflikt und der Start schlägt fehl. Einer der Optimierungspunkte besteht darin, den automatischen Neustart des Skripts zu unterstützen. Finden Sie automatisch den entsprechenden Prozess, beenden Sie ihn und starten Sie ihn neu. Ein weiterer Punkt ist die Protokolldatei. Nach dem Neustart wird eine neue Protokolldatei basierend auf dem Dienstnamen und der aktuellen Zeit generiert. Wenn beim Abfragen des Protokolls Dateien mit mehreren Präfixen vorhanden sind, müssen Sie diese manuell auswählen . Ich habe darüber nachgedacht, die historischen Protokolldateien im aktuellen Sicherungsordner unter dem Pfad zu archivieren.
Zunächst möchte ich festhalten, dass ich ein Shell-Neuling bin und diesen Bereich kaum nutzen kann.
Ich verwende dafür am liebsten den Befehl lsof. Um beispielsweise die von Port 8080 belegten Prozesse abzufragen, können Sie den folgenden Befehl verwenden
lsof -i:8080
Das sollten Sie alle wissen: kill -9, verwenden Sie nicht einfach kill, sondern beenden Sie den Prozess beispielsweise mit der Prozess-PID 12345.
kill -9 12345
Dies ist ein relativ einfacher Befehl und die Parameter der Funktion werden entsprechend verwendet.$1
,$2
,$3
…bekommen
Da es mehrere Java-Dienste gibt und ich auch an der Idee der Wiederverwendung festhalte, habe ich darüber nachgedacht, eine gemeinsame Methode zum Neustarten des Dienstes zu schreiben und dann Skripte zu schreiben, die mehreren Diensten entsprechen, um deren jeweilige Dienstnamen, Ports und andere Informationen aufzuzeichnen. In den jeweiligen Skripten der Dienste ruft der Middle-Pass-Parameter die allgemeine Start- oder Neustartmethode des Dienstes auf.
Allgemeines Dienststart- oder Neustartskript 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}"
}
Startskript für einen einzelnen Dienst
#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
# 执行通用服务脚本中的启动方法
start_app xxx.jar 8080 4096 ${action}
}
#程序主入口
start
Wenn das Dienststartskript direkt ohne Übergabe von Parametern ausgeführt wird, wird beurteilt, ob der Dienstport belegt ist. Wenn ein Neustart durchgeführt wird, wird der ursprüngliche Dienstprozess beendet und dann neu gestartet Der Dienst wird gestartet.
Das JAR-Paket befindet sich im Verzeichnis /opt/app, das Skript im Verzeichnis /opt/app/run und das Protokoll im Verzeichnis /opt/app/logs. Derzeit kann diese Version nur die Ausführung unterstützen Im aktuellen Verzeichnis des Skripts meldet die Methode einen Fehler, der dadurch verursacht werden kann, dass einige Schreibmethoden im Skript keine absoluten Pfade verwenden. Daher behalten wir dies bei Lösung für den Moment.
Beim Testen aufgetretenrun.sh: xxx行 $'r' 附近有语法错误
Fehler, verwenden Sie den Befehl sed -i 's/r$//' run.sh, um ihn zu konvertieren.