Partage
  • Partager sur Facebook
  • Partager sur Twitter

"Traduire" un fichier .bat en shell

Linux / Ubuntu

7 juin 2020 à 16:06:59

Bonjour,

dans le but d'accueillir le serveur minecraft d'un ami sur mon réseau, j'ai téléchargé ngrok, ainsi que tous les éléments nécessaires pour entretenir le serveur (fournis par l'ami en question). J'ai lu le procédé à suivre pour cela, mais je suis bloqué à l'étape où il faut éxécuter un fichier .bat. J'ai lu dans d'autres forums que l'extension .bat est incompatible avec Ubuntu, et qu'il faut le convertir en shell. Hélas je n'ai jamais touché à ce langage, c'est pourquoi je fait appel à vous pour m'aider.

Voici le contenu de fichier .bat en question :

java -Xmx1024M -jar server.jar -o false
PAUSE



  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2020 à 16:53:12

Bonjour,

Passez ton fichier .bat en .sh devrait suffire.

  • Partager sur Facebook
  • Partager sur Twitter
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain
8 juin 2020 à 12:32:16

Bonjour,

eclairia a écrit:

Passez ton fichier .bat en .sh devrait suffire.

Ploof, ploof! une chance sur deux dommage ;) Et les extensions de fichiers avec Linux ne modifie pas les propriété d'un fichier. Tu peux appeler une image monimage.sh, ça en fera pas un script shell exécutable.

@alexpatt: La commande java devrait fonctionner (pourvu que l'environnement Java soit installé bien sûr) de la même manière.

Que fait le PAUSE ? Parce que ça, ce n'est pas une commande sh ou bash. Je suppose que c'est pour ne pas terminer le script et ne pas tuer le process associé au serveur lorsque le script exit?

  • Solution simple: faire tourner le serveur en arrière plan avec nohup (dissocie le serveur de la console qui a servie à lancer le script et le fait tourner en arrière plan)
#!/usr/bin/env bash
nohup java -Xmx1024 -jar serveur.jar -o false

Pour terminer le process par contre, il faudra le tuer manuellement.

J'ai rajouté un shebang pour déterminer le shell à utiliser pour exécuter le script (à toi de voir ce qui est plus approprié).

  • Solution plus propre:en faire une unité systemd
Mais ce n'est pas forcément facile à mettre en place pour un débutant sur Ubuntu. Par contre,c'est beaucoup plus simple ensuite d'administrer le serveur (démarage du serveur, arrêt, automatisation du démarrage du serveur, statut, log). Essayes de voir s'il existe des tutos «Minecraft jar systemd».
  • Partager sur Facebook
  • Partager sur Twitter
12 juin 2020 à 3:34:14

KoaTao a écrit:

Que fait le PAUSE ? Parce que ça, ce n'est pas une commande sh ou bash. Je suppose que c'est pour ne pas terminer le script et ne pas tuer le process associé au serveur lorsque le script exit?

"pause" est une commande batch permettant d'attendre une action de l'utilisateur sur le clavier pour passer à l'instruction suivante.

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 9:05:19

KoaTao a écrit:

Bonjour,

eclairia a écrit:

Passez ton fichier .bat en .sh devrait suffire.

Ploof, ploof! une chance sur deux dommage ;) Et les extensions de fichiers avec Linux ne modifie pas les propriété d'un fichier. Tu peux appeler une image monimage.sh, ça en fera pas un script shell exécutable.

@alexpatt: La commande java devrait fonctionner (pourvu que l'environnement Java soit installé bien sûr) de la même manière.

Que fait le PAUSE ? Parce que ça, ce n'est pas une commande sh ou bash. Je suppose que c'est pour ne pas terminer le script et ne pas tuer le process associé au serveur lorsque le script exit?

  • Solution simple: faire tourner le serveur en arrière plan avec nohup (dissocie le serveur de la console qui a servie à lancer le script et le fait tourner en arrière plan)
#!/usr/bin/env bash
nohup java -Xmx1024 -jar serveur.jar -o false

Pour terminer le process par contre, il faudra le tuer manuellement.

J'ai rajouté un shebang pour déterminer le shell à utiliser pour exécuter le script (à toi de voir ce qui est plus approprié).

  • Solution plus propre:en faire une unité systemd

Mais ce n'est pas forcément facile à mettre en place pour un débutant sur Ubuntu. Par contre,c'est beaucoup plus simple ensuite d'administrer le serveur (démarage du serveur, arrêt, automatisation du démarrage du serveur, statut, log). Essayes de voir s'il existe des tutos «Minecraft jar systemd».


j'ai pas vraiment compris...

faut que j'édites le fichier .bat non ?

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 14:34:25

Bonjour,

Oui il faut modifier le fichier .bat. Il faut en fait re-écrire un script shell.

La commande java ne change pas.

D'après ce que je comprends, le PAUSE (comme l'a indiqué @Cypher_) sert surtout à ne pas quitter le script ce qui tuerait le serveur en conséquence, non ?

Je trouve que c'est moche et peu pratique de faire ça, un missclick, ou une déconnexion (si c'est hébergé sur un serveur distant par exemple) pourrait faire quitter le script et terminer le serveur.

Ce que je te propose c'est ce script (j'avais oublié le & à la fin d'ailleurs):

#!/usr/bin/env bash
nohup java -Xmx1024 -jar serveur.jar -o false &

Tu le nommes comme tu veux (habituellement, on donne l'extension .sh à des script bash ou sh).

Tu le rends exécutable:

$ chmod +x tonscript.sh

Et tu l’exécutes :

$ ./tonscript.sh

Tout devrait se passer en tâche de fond et ne sera pas liée à la console qui a servi à lancer le script. Donc mis-à-part une erreur fatal, tant que tu ne termines pas manuellement ton serveur minecraft, il tournera quoi qu'il arrive.

Pour tuer ton serveur, tu peux utiliser la commande ps pour récupérer son pid:

ps -aux

Ensuite, tu fais:

kill pid_du_serveur

Et voilà.

Les commandes pgrep, voire pkill peuvent rendre l'opération encore plus simple et rapide.

-
Edité par KoaTao 19 juin 2020 à 14:34:44

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 17:17:14

quand je fais 
./run.sh

une autre commande semble se lancer toute seule... :

nohup: la sortie est ajoutée à 'nohup.out'

et on dirait qu'elle attend que je rentre quelquechose, en tout cas tout se fige...

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 18:14:47

alexpatt a écrit:

nohup: la sortie est ajoutée à 'nohup.out'

Cette sortie est normale, elle t'indique juste que ce qui devait être affiché normalement sur la sortie standard, s'affichera dans le fichier nohup.out. Tu peux rediriger toi même la sortie vers le fichier de ton choix mais on commence à complexifier le truc (nohup command &> fichier.log &).

alexpatt a écrit:

et on dirait qu'elle attend que je rentre quelquechose, en tout cas tout se fige...

As-tu bien ajouté le & à la fin de la ligne ? Normalement, après avoir lancé le script, tu peux interagir avec la console.

Bon, parce que je suis sympa, et que ça permet de te fournir une solution passable et simple d'utilisation (et que ça me dérange pas de le faire en vrai ^^):

#!/usr/bin/env bash

# Script qui prend en 1 argument: start ou kill
log="log.txt" # emplacement du fichier de log
pidfile="serveur.pid" # emplacement du fichier stockant le pid du serveur
scriptName="$0" # nom de ce script
case "$1" in
    "start")
        if [ ! -f $pidfile ]; then # S'assure qu'aucun serveur ne tourne déjà en checkant si le fichier $pidfile existe ou non
            nohup java -Xmx1024 -jar serveur.jar -o false &> $log & # Lance le serveur en tâche de fond, détaché de sa console d'origine, et utilise le fichier log.txt pour stocker tout ce qui aurait du être affiché dans la console
            echo $! > $pidfile # créé le fichier $pidfile et y stocke le pid du serveur
        else
            echo "Erreur : le serveur existe déjà"
            echo "Fichier $pidfile présent."
        fi
        ;;
    "kill")
        if [ -f $pidfile ]; then
            kill -9 $(cat $pidfile) # Tue le serveur (signal 9 = SIGKILL)
            rm $pidfile # Supprime le fichier $pidfile
        else
            echo "Erreur: Impposible de tuer le serveur"
            echo "Pas de fichier $pidfile trouvé."
        fi
        ;;
    *)
        echo "Pas un bon argument fournie"
        echo "Usage : "
        echo "Démarrage du serveur : $scriptName start"
        echo "Arrêt du serveur     : $scriptName kill"
        ;;
esac

Pour démarrer:

./tonscript.sh start

Pour tuer le serveur:

./tonscript.sh kill

EDIT: sache que ça reste une solution du pauvre ;)

-
Edité par KoaTao 19 juin 2020 à 18:23:30

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 18:28:11

:-°
juste un problème je crois :
./run.sh kill
./run.sh: ligne 19 : kill: (18807) - Aucun processus de ce type
et dans nohut.out il y a :
Error: Unable to access jarfile serveur.jar

-
Edité par alexpatt 19 juin 2020 à 18:31:39

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 18:33:40

EDIT:

La commande:

java -Xmx1024 -jar serveur.jar -o false
fonctionne de base ?

-
Edité par KoaTao 19 juin 2020 à 18:35:07

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 18:45:33

java -Xmx1024 -jar serveur.jar -o false
Error: Unable to access jarfile serveur.jar



-
Edité par alexpatt 19 juin 2020 à 18:50:07

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 18:50:33

Donne le retour de:

stat serveur.jar

-
Edité par KoaTao 19 juin 2020 à 18:51:15

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 18:56:51

java -Xmx1024 -jar serveur.jar -o false
Error: Unable to access jarfile serveur.jar
  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2020 à 19:07:48

Bon, c'est vrai qu'on avait pas précisé, mais serveur.jar désigne l'emplacement de ton fichier ,jar. Donc assure toi qu'il existe (serveur != server par exemple).

Voilà la version révisée (qui devrait récupérer le bon pid) du script à toi de compléter pour que les chemins vers les fichiers correspondent à ta config:

#!/usr/bin/env bash

# Script qui prend en argument: start ou kill
log="log.txt" # emplacement du fichier de log
pidfile="serveur.pid" # emplacement du fichier stockant le pid du serveur
scriptName="$0" # nom de ce script
jarfile="serveur.jar" # emplacement du fichier .jar
case "$1" in
    "start")
        if [ ! -f "$pidfile" ]; then # S'assure qu'aucun serveur ne tourne déjà en checkant si le fichier $pidfile existe ou non
            nohup java -Xmx1024m -jar "$jarfile" &> $log & # Lance le serveur en tâche de fond, détaché de sa console d'origine, et utilise le fichier log.txt pour stocker tout ce qui aurait du être affiché dans la console
            jps -l | awk -v jarfile="$jarfile" '$2 == jarfile { print $1 }' > "$pidfile" # créé le fichier $pidfile et y stocke le pid du serveur
        else
            echo "Erreur : le serveur existe déjà"
            echo "Fichier $pidfile présent."
        fi
        ;;
    "kill")
        if [ -f "$pidfile" ]; then
            kill -9 $(cat "$pidfile") # Tue le serveur (signal 9 = SIGKILL)
            rm "$pidfile" # Supprime le fichier $pidfile
        else
            echo "Erreur: Impposible de tuer le serveur"
            echo "Pas de fichier $pidfile trouvé."
        fi
        ;;
    *)
        echo "$1 : argument inconnue"
        echo "Usage : "
        echo "Démarrage du serveur : $scriptName start"
        echo "Arrêt du serveur     : $scriptName kill"
        ;;
esac

EDIT : à toi de voir la commande java qui convient à ton serveur Minecraft, la commande présente dans le script est celle que j'ai utilisé pour le tester avec un petit serveur tout simple la récupération du pid.

-
Edité par KoaTao 19 juin 2020 à 19:16:09

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2020 à 10:49:42

./run.sh start
./run.sh: ligne 12: jps : commande introuvable
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2020 à 11:51:30

Apparemment, jps n'est pas implémenté sur ton système. Essaye en remplaçant la ligne 12 par:

pgrep -f -u $EUID "java.*$jarfile" > "$pidfile"

Tu peux aussi remplacer la ligne 20 par :

pkill -9 -F "$pidfile"

 EDIT: Et je te conseille d'éviter les noms de fichier éxotiques pour le fichier .jar (limite toi aux caractères alphanumériques, à l'espace, tiret (-), underscore (_) et au point (.)).

-
Edité par KoaTao 21 juin 2020 à 12:01:59

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2020 à 19:12:52

j'ai l'impression qu'au bout d'un certain temps le ./run.sh kill ne fonctionne plus..

par exemple, je l'avais (pas vrm volontairement) laissé ouvert la journée, et voici ce que le terminal a retourné quand je viens d'essayer de le fermer :

./run.sh kill
pkill: fichier pid pas valable
Essayez « pkill --help » pour plus d'informations.


EDIT : quand le serveur est actif, il bouffe tout mon cpu (qui est pas ouf faut l'avouer)... y a t il pas moyen de le calmer un peu ???

-
Edité par alexpatt 21 juin 2020 à 19:25:49

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2020 à 20:12:19

Bonsoir,

Deux cas possibles:

  • Le fichier serveur.pid a été supprimé. Normalement, rien ne devrait le supprimer s'il n'est pas placé dans un fichier temporaire.
  • Le fichier serveur.pid est vide ou ne contient pas une liste de pid. S'il est créé et vide, c'est que la commande pgrep n'a pas retournée de pid (ça va commencer à être dur à debug si tu n'y connais pas grand chose à Linux).

De toute manière, c'est un script du pauvre comme je l'ai indiqué, des fois ça peut bug (il y a beaucoup de cas qui ne sont pas couverts), il faut donc agir manuellement si tu ne peux pas l'améliorer toi-même:

  • Récupérer le pid de ton serveur (deuxième colonne):
ps -aux
  • Le tuer soi-même:
kill pid_du_serveur
  • Supprimer le fichier serveur.pid s'il existe (vu qu'il agit comme verrou):
rm serveur.pid

Pour ce qui est des ressources allouées au serveur, je n'en sais rien concrètement. Ça dépend des ressources matérielles du serveur et des ressources dont à besoin Minecraft pour tourner. Je ne connais ni Minecraft (que de nom) ni ton serveur.

La commande java te permet de définir la mémoire heap maximale allouée à ta machine virtuelle:

java -Xmx<taille_mémoiremax> -jar blablalba

Par exemple, dans mon exemple de script, c'est 1024m (m pour méga) soit 1G.

Pour le processeurs, on commence à toucher vraiment à de l'admin système, tu as les commandes taskset et nice, sinon après faut se tourner vers de cgroup ou des containers comme docker pour pouvoir gérer plus finement les ressources allouées. Mais lui donner moins de ressources va sûrement donner moins de performances.

Je suis étonné d'ailleurs qu'il n'existe pas d'interface graphique (via un panel web comme il se fait beaucoup maintenant) pour configurer et gérer un serveur Minecraft sur Linux vu la popularité du jeu et la concurrence qu'il existe dans le milieu!

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2020 à 21:29:14

ok c'est parfait

merci beaucoup !!!

  • Partager sur Facebook
  • Partager sur Twitter