informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sebuah sistem yang terdiri dari beberapa aplikasi Java yang digunakan dalam lingkungan offline perlu dirilis lebih sering selama tahap pengujian. Karena keterbatasan sumber daya, tidak ada set devops atau CICD, sehingga hanya dikemas ke dalam toples untuk dirilis. Saya menggunakan skrip untuk memulai sebelumnya. Sebelum memulai, saya harus menghentikan proses sesuai dengan port yang diterima, jika tidak maka akan ada konflik port dan startup akan gagal. Salah satu poin optimasi adalah mendukung restart otomatis skrip, secara otomatis menemukan proses yang sesuai dan kemudian mematikan dan memulai kembali. Poin lainnya adalah file log. Setelah memulai ulang, file log baru akan dibuat berdasarkan nama layanan dan waktu saat ini. Saat menanyakan log, jika ada file dengan banyak awalan, Anda harus memilihnya secara manual, yang merepotkan Saya berpikir untuk mengarsipkan file log historis ke folder cadangan saat ini di bawah jalur.
Pertama-tama, saya ingin menyatakan bahwa saya seorang pemula shell dan jarang menggunakan area ini.
Saya lebih suka menggunakan perintah lsof untuk ini. Misalnya, untuk menanyakan proses yang ditempati oleh port 8080, Anda dapat menggunakan perintah berikut
lsof -i:8080
Ini harusnya kalian semua tahu, kill -9, jangan asal pakai kill, misal kill proses dengan PID proses 12345.
kill -9 12345
Ini adalah perintah yang relatif sederhana, dan parameter fungsi digunakan sesuai dengan itu.$1
,$2
,$3
…menerima
Karena ada beberapa layanan Java, dan juga mengikuti gagasan penggunaan kembali, saya berpikir untuk menulis metode umum untuk memulai ulang layanan, dan kemudian menulis skrip yang sesuai dengan beberapa layanan untuk mencatat nama layanan, port, dan informasi lainnya masing-masing. Di masing-masing skrip layanan Parameter jalur tengah memanggil metode startup atau restart layanan umum.
Startup layanan umum atau restart skrip 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}"
}
Skrip startup layanan tunggal
#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
# 执行通用服务脚本中的启动方法
start_app xxx.jar 8080 4096 ${action}
}
#程序主入口
start
Jika skrip startup layanan langsung dijalankan tanpa melewati parameter, maka akan dinilai apakah port layanan terisi. Jika sudah terisi, maka akan langsung keluar. Jika restart dilewati, proses layanan asli akan dihentikan dan kemudian dimulai ulang ketika layanan dimulai.
Paket jar terletak di direktori /opt/app, skrip terletak di direktori /opt/app/run, dan log ditempatkan di direktori /opt/app/logs. Saat ini, versi ini hanya dapat mendukung eksekusi di direktori skrip saat ini. Jika jalur absolut digunakan Metode ini akan melaporkan kesalahan, yang mungkin disebabkan oleh beberapa metode penulisan dalam skrip tidak menggunakan jalur absolut. Masing-masing memiliki kelebihan dan kekurangannya sendiri, jadi kami akan menyimpannya solusi untuk saat ini.
Ditemui saat pengujianrun.sh: xxx行 $'r' 附近有语法错误
kesalahan, gunakan perintah sed -i 's/r$//' run.sh untuk mengonversinya.