2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Un système composé de plusieurs applications Java déployées dans un environnement hors ligne doit être publié plus fréquemment pendant la phase de test. En raison de contraintes de ressources, il n'y a pas de développement ou de CICD, il est donc simplement emballé dans un fichier jar pour la publication. J'ai déjà utilisé un script pour démarrer. Avant de commencer, je dois tuer le processus en fonction du port reçu, sinon il y aura un conflit de port et le démarrage échouera. L'un des points d'optimisation est de prendre en charge le redémarrage automatique du script, trouvez automatiquement le processus correspondant, puis tuez et redémarrez. Un autre point est le fichier journal. Après le redémarrage, un nouveau fichier journal sera généré en fonction du nom du service et de l'heure actuelle. Lors de l'interrogation du journal, s'il existe des fichiers avec plusieurs préfixes, vous devez les sélectionner manuellement, ce qui est gênant. . J'ai pensé à archiver les fichiers journaux historiques dans le dossier de sauvegarde actuel sous le chemin.
Tout d’abord, je tiens à préciser que je suis un novice en shell et que j’utilise peu ce domaine.
Je préfère utiliser la commande lsof pour cela. Par exemple, pour interroger les processus occupés par le port 8080, vous pouvez utiliser la commande suivante.
lsof -i:8080
Vous devriez tous le savoir, kill -9, n'utilisez pas simplement kill, par exemple, tuez le processus avec le processus PID 12345.
kill -9 12345
Il s'agit d'une commande relativement simple et les paramètres de la fonction sont utilisés en conséquence.$1
,$2
,$3
…recevoir
Parce qu'il existe plusieurs services Java, et adhérant également à l'idée de réutilisation, j'ai pensé à écrire une méthode commune pour redémarrer le service, puis à écrire des scripts correspondant à plusieurs services pour enregistrer leurs noms de service, ports et autres informations respectifs. Dans les scripts respectifs des services, le paramètre middle pass appelle la méthode commune de démarrage ou de redémarrage du service.
Démarrage du service commun ou script de redémarrage 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 de démarrage d'un service unique
#!/bin/bash
action=$1
## 引入通用服务启动脚本
source ./run.sh
#启动方法
start(){
# 执行通用服务脚本中的启动方法
start_app xxx.jar 8080 4096 ${action}
}
#程序主入口
start
Si le script de démarrage du service est directement exécuté sans transmettre de paramètres, il sera jugé si le port de service est occupé, s'il est occupé, il se terminera directement. Si le redémarrage est réussi, le processus de service d'origine sera tué puis redémarré. le service est démarré.
Le package jar se trouve dans le répertoire /opt/app, le script se trouve dans le répertoire /opt/app/run et le journal est placé dans le répertoire /opt/app/logs Actuellement, cette version ne peut prendre en charge que l'exécution. dans le répertoire courant du script. Si un chemin absolu est utilisé La méthode signalera une erreur, qui peut être causée par certaines méthodes d'écriture dans le script n'utilisant pas de chemins absolus. Chacune a ses propres avantages et inconvénients, nous conserverons donc cela. solution pour l'instant.
Rencontré lors des testsrun.sh: xxx行 $'r' 附近有语法错误
erreur, utilisez la commande sed -i 's/r$//' run.sh pour le convertir.