τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Ένα σύστημα που αποτελείται από πολλές εφαρμογές Java που αναπτύσσονται σε περιβάλλον εκτός σύνδεσης πρέπει να κυκλοφορεί πιο συχνά κατά τη φάση δοκιμής Λόγω περιορισμών πόρων, δεν υπάρχει σύνολο devops ή CICD, επομένως απλώς συσκευάζεται σε ένα βάζο για κυκλοφορία. Χρησιμοποίησα ένα σενάριο για να ξεκινήσω πριν ξεκινήσω, πρέπει να σκοτώσω τη διαδικασία σύμφωνα με τη θύρα που έλαβα, διαφορετικά θα υπάρξει διένεξη θύρας και η εκκίνηση θα αποτύχει. βρείτε αυτόματα την αντίστοιχη διαδικασία και μετά σκοτώστε και επανεκκινήστε. Ένα άλλο σημείο είναι το αρχείο καταγραφής Μετά την επανεκκίνηση, θα δημιουργηθεί ένα νέο αρχείο καταγραφής με βάση το όνομα της υπηρεσίας και την τρέχουσα ώρα, εάν υπάρχουν αρχεία με πολλά προθέματα, θα πρέπει να τα επιλέξετε με μη αυτόματο τρόπο. Σκέφτηκα να αρχειοθετήσω τα ιστορικά αρχεία καταγραφής στον τρέχοντα φάκελο ασφαλείας κάτω από τη διαδρομή.
Καταρχάς, θα ήθελα να δηλώσω ότι είμαι αρχάριος του κελύφους και χρησιμοποιώ ελάχιστα αυτόν τον τομέα.
Προτιμώ να χρησιμοποιήσω την εντολή lsof για αυτό, για παράδειγμα, για να κάνετε ερώτημα στις διαδικασίες που καταλαμβάνει η θύρα 8080, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή
lsof -i:8080
Θα πρέπει να το ξέρετε όλοι αυτό, σκοτώστε -9, μην χρησιμοποιείτε απλώς kill, για παράδειγμα, σκοτώνετε τη διαδικασία με τη διαδικασία PID 12345.
kill -9 12345
Αυτή είναι μια σχετικά απλή εντολή και οι παράμετροι της συνάρτησης χρησιμοποιούνται ανάλογα.$1
,$2
,$3
…να λάβω
Επειδή υπάρχουν πολλές υπηρεσίες Java και, επίσης, τηρώντας την ιδέα της επαναχρησιμοποίησης, σκέφτηκα να γράψω μια κοινή μέθοδο επανεκκίνησης της υπηρεσίας και στη συνέχεια να γράψω σενάρια που αντιστοιχούν σε πολλές υπηρεσίες για να καταγράψω τα αντίστοιχα ονόματα υπηρεσιών, θύρες και άλλες πληροφορίες. Στα αντίστοιχα σενάρια των υπηρεσιών Η παράμετρος μεσαίο πέρασμα καλεί τη μέθοδο εκκίνησης ή επανεκκίνησης της κοινής υπηρεσίας.
Εκκίνηση κοινής υπηρεσίας ή επανεκκίνηση του σεναρίου 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}"
}
Σενάριο εκκίνησης μιας υπηρεσίας
#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
# 执行通用服务脚本中的启动方法
start_app xxx.jar 8080 4096 ${action}
}
#程序主入口
start
Εάν εκτελέσετε απευθείας τη δέσμη ενεργειών εκκίνησης της υπηρεσίας χωρίς να μεταβιβάσετε παραμέτρους, θα προσδιορίσει εάν η θύρα υπηρεσίας είναι κατειλημμένη, θα βγει απευθείας, εάν επικυρωθεί η επανεκκίνηση, η αρχική διαδικασία υπηρεσίας θα τερματιστεί και στη συνέχεια θα επανεκκινηθεί έχει ξεκινήσει.
Το πακέτο jar βρίσκεται στον κατάλογο /opt/app, το σενάριο βρίσκεται στον κατάλογο /opt/app/run και το αρχείο καταγραφής τοποθετείται στον κατάλογο /opt/app/logs Επί του παρόντος, αυτή η έκδοση μπορεί να υποστηρίξει μόνο την εκτέλεση στον τρέχοντα κατάλογο του σεναρίου Εάν χρησιμοποιείται μια απόλυτη διαδρομή Η μέθοδος θα αναφέρει ένα σφάλμα, το οποίο μπορεί να προκληθεί από ορισμένες μεθόδους γραφής στο σενάριο που δεν χρησιμοποιούν απόλυτες διαδρομές, οπότε θα το διατηρήσουμε λύση προς το παρόν.
Συναντήθηκε κατά τη διάρκεια της δοκιμήςrun.sh: xxx行 $'r' 附近有语法错误
σφάλμα, χρησιμοποιήστε την εντολή sed -i 's/r$//' run.sh για να το μετατρέψετε.