Obtenir le statut en démarrant le serveur HTTP Java en script shell

Mon problème sera un peu difficile à expliquer, alors s’il vous plaît, supportez-moi.

J’essaie d’écrire un script shell qui lancera un serveur HTTPServer Java en tant que processus d’arrière-plan. La ligne pertinente dans le script est apparemment très simple:

java -jar "$jar.jar" &

Cependant, je dois vérifier que Java ne tente pas d’exécuter le jar. Par exemple, si je touch Server.jar , je veux intercepter l’échec de java pour exécuter ce fichier jar vide. Donc, j’essayais juste de l’envelopper dans une déclaration if:

 if ! java -jar "$jar.jar" & then echo "Couldn't start server" >&2 fi 

Cela ne fonctionne pas. Le statut renvoyé est le même, que Java soit ou non capable d’exécuter le jar . J’ai remarqué que si je omet l’esperluette à la fin, cela fait ce que je veux dans les cas où le jar est mauvais. Cependant, cela oblige évidemment le script à attendre sur cette ligne jusqu’à ce que le serveur soit arrêté lorsque le fichier JAR est correct. Il est donc impossible d’envoyer le processus en arrière-plan.

Y a-t-il un moyen facile d’accomplir cela?

Une méthode courante consiste à ignorer complètement le statut de sortie et à vérifier que le serveur démarre correctement dans un délai imparti (ici, il ouvre le port 8080 comme indiqué par nc ):

 # Start server java -jar "$jar.jar" & # Wait for up to 30s printf "%s" "Waiting for server to respond" timeout=30 until nc -z localhost 8080 || (( --timeout == 0 )) do sleep 1 printf "." done # Check result if (( timeout > 0 )) then echo "Server started successfully" else echo "Server still not responding" fi 

C’est mieux que de s’assurer que le processus se déroule pendant 30 secondes sans mourir, car dans le cas présent, cela se poursuivra très rapidement.

Vous pouvez aussi le faire immédiatement si le processus meurt (comme vérifié avec kill -0 $! ). Cela fonctionne probablement pour votre commande java , mais d’autres serveurs comme Apache ont des commandes de démarrage qui sortent immédiatement pendant que le serveur continue à fonctionner.

Vous pouvez essayer d’utiliser un code de retour. Voici un exemple:
Script cat script.sh

 #!/bin/bash java -jar "$1" STATUS="${?}" if [ $STATUS -eq 0 ] then echo "Good" else echo "Bad" fi 

Usage:

 ➭ ./script.sh good.jar ... Good ➭ ./script.sh bad.jar ... Bad 

Je préfère utiliser “pidof” pour obtenir le PID du processus, tel que:

 GETPID=$(pidof java) if [ "${GETPID}VVV" == "VVV" ] ; then echo "The process is BAD" else echo "The process is OK" fi