Script Shell pour la Gestion du Cycle de Vie des Applications Java sous Linux

Gestion Manuelle des Processus Java

Avant d'automatiser le déploiement, il est utile de comprandre les commandes natives pour interagir avec les applications Java sur un système Linux.

Lancement d'une application :

nohup java -jar mon-application.jar > /dev/null 2>&1 &

Identification du PID :

# Utilisation de jps (inclus dans le JDK)
jps -l

# Ou utilisation de pgrep
pgrep -f mon-application.jar

Arrêt du processus :

# Arrêt propre
kill $(pgrep -f mon-application.jar)

# Arrêt forcé si nécessaire
kill -9 $(pgrep -f mon-application.jar)

Bien que ces commandes soient fonctionnelles, leur exécution répétitive est fastidieuse. L'utilisation d'un script d'initialisation permet de standardiser et de simplifier ces opérations.

Automatisation via un Script Shell

Le script ci-dessous encapsule la logique de démarrage, d'arrêt, de redémarrage et de vérification de l'état d'un service Java. Il gère également les paramètres de la JVM et la redirection des journaux.

Créez un fichier nommé service-manager.sh et accordez-lui les permissions d'exécution (chmod +x service-manager.sh).

#!/bin/bash
# Script de gestion du cycle de vie d'une application Java

# --- Configuration du Service ---
SERVICE_NAME="api-backend"
APP_PORT=8080
DEPLOY_DIR="/opt/java-apps"
ARTIFACT_NAME="backend-service-1.0.0.jar"
PID_FILE="${DEPLOY_DIR}/${ARTIFACT_NAME}.pid"
LOG_DIR="${DEPLOY_DIR}/logs"

# Paramètres de la JVM
JVM_ARGS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8"

# --- Fonctions Utilitaires ---

# Vérifie si le processus est actif
check_status() {
    if [[ -f "$PID_FILE" ]]; then
        CURRENT_PID=$(cat "$PID_FILE")
        if ps -p "$CURRENT_PID" > /dev/null 2>&1; then
            return 0 # En cours d'exécution
        fi
    fi
    return 1 # Arrêté
}

# Démarrage du service
do_start() {
    check_status
    if [[ $? -eq 0 ]]; then
        echo "Le service $SERVICE_NAME est déjà actif (PID: $CURRENT_PID)."
        return
    fi

    mkdir -p "$LOG_DIR/gc"
    echo "Démarrage de $SERVICE_NAME..."
    
    nohup java $JVM_ARGS \
        -Xlog:gc*:file="$LOG_DIR/gc/gc.log":time,uptime,level,tags:filecount=5,filesize=10M \
        -jar "${DEPLOY_DIR}/${ARTIFACT_NAME}" \
        > "${LOG_DIR}/application.log" 2>&1 &
        
    echo $! > "$PID_FILE"
    echo "Service $SERVICE_NAME démarré avec succès (PID: $!)."
}

# Arrêt du service
do_stop() {
    check_status
    if [[ $? -ne 0 ]]; then
        echo "Le service $SERVICE_NAME n'est pas en cours d'exécution."
        return
    fi

    echo "Arrêt du service $SERVICE_NAME (PID: $CURRENT_PID)..."
    kill "$CURRENT_PID"
    
    # Attente de l'arrêt gracieux
    for i in {1..10}; do
        if ! ps -p "$CURRENT_PID" > /dev/null 2>&1; then
            break
        fi
        sleep 1
    done

    # Forcer l'arrêt si le processus résiste
    if ps -p "$CURRENT_PID" > /dev/null 2>&1; then
        echo "Arrêt forcé du processus..."
        kill -9 "$CURRENT_PID"
    fi

    rm -f "$PID_FILE"
    echo "Service $SERVICE_NAME arrêté."
}

# Redémarrage du service
do_restart() {
    do_stop
    sleep 2
    do_start
}

# Affichage de l'état
do_status() {
    check_status
    if [[ $? -eq 0 ]]; then
        echo "$SERVICE_NAME est en cours d'exécution (PID: $CURRENT_PID)."
    else
        echo "$SERVICE_NAME est arrêté."
    fi
}

# Menu d'aide
show_usage() {
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
}

# --- Exécution ---
case "$1" in
    start)   do_start ;;
    stop)    do_stop ;;
    restart) do_restart ;;
    status)  do_status ;;
    *)       show_usage ;;
esac
exit 0

Note sur les répertoires : Ce script génère des fichiers de journaux dans le dossier défini par LOG_DIR. Assurez-vous que l'utilisateur exécutant le script dispose des droits d'écriture sur ce répertoire.

Utilisation du Script

Une fois le script configuré, vous pouvez contrôler l'application via les commandes suivantes :

  • Démarrer : ./service-manager.sh start
  • Arrêter : ./service-manager.sh stop
  • Redémarrer : ./service-manager.sh restart
  • Vérifier l'état : ./service-manager.sh status

Optimisation du Temps de Démarrage de la JVM

Si le démarrage de votre application Java semble anormalement lent sous Linux, cela est souvent dû à une résolution DNS bloquante lors de l'initialisation de la machine virtuelle, en particulier avec la génération d'entropie pour SecureRandom.

Pour résoudre ce problème, mappez le nom d'hôte de votre serveur à l'adresse de bouclage local dans le fichier /etc/hosts.

1. Identifiez le nom d'hôte actuel :

hostname

2. Modifiez le fichier de configuration :

sudo nano /etc/hosts

3. Ajoutez la ligne suivante (en remplaçant par votre nom d'hôte réel) :

127.0.0.1   localhost mon-serveur-local

Cet ajustement permet à la JVM de résoudre instantanément le nom de la machine, réduisant ainsi considérablement le temps d'initialisation.

Étiquettes: Java Linux Shell bash JVM

Publié le 9 juin à 19h59