#1 Le 23/02/2020, à 15:53
- katian
[ASTUCE ?] systemd, stop & service
Bonjour,
Dans un service, lors d'un
$ sudo systemctl stop <service>
si vous voulez attendre la fin du process lancé par
ExecStart=
il existe une solution :
ExecStop=/bin/bash -c "while ps -p $MAINPID > /dev/null; do /bin/sleep 1; done"
le $MAINPID contient l'ID du process lancé par ExecStart
voila...
Dernière modification par katian (Le 23/02/2020, à 16:32)
Hors ligne
#2 Le 23/02/2020, à 16:27
- bruno
Re : [ASTUCE ?] systemd, stop & service
Bonjour,
Attention de ne pas faire une généralité d'un cas sans doute très particulier.
Peux-tu expliquer en détail pourquoi tu as besoin de faire cela et donner l'intégralité du fichier de service utilisé.
La variable $MAINPID n'est pas forcément renseignée (processus multiples)
Et, de ce que j'en comprends, si la variable $MAINPID contient quelque chose ExecStop va tourner indéfiniment.
#3 Le 23/02/2020, à 16:31
- katian
Re : [ASTUCE ?] systemd, stop & service
mon enthousiasme me perdra, bruno voici mon service :
mc_server@.service
[Unit]
Description=Minecraft server: %i
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/home/mc_user/mc_server
User=mc_user
Group=mc_user
Nice=+0
ExecStart=/usr/bin/screen -DmS mc-%i /usr/bin/java -Xmx4G -Xms2G -jar /home/mc_user/mc_server/server.jar nogui
ExecStop=/usr/bin/screen -p 0 -S mc-%i -X stuff "stop^M"
ExecStop=/bin/bash -c "while ps -p $MAINPID > /dev/null; do /bin/sleep 1; done"
[Install]
WantedBy=multi-user.target
Hors ligne
#4 Le 23/02/2020, à 16:47
- bruno
Re : [ASTUCE ?] systemd, stop & service
Je ne connais pas Minecarft, mais il y a a sûrement une manière plus fiable de faire cela. Voir https://minecraft.gamepedia.com/Tutoria … emd_Script
Et je persiste à croire que le dernier ExecStop est soit inutile ($MAINPID n'existe pas), soit une boucle infinie ($AMINPID a une valeur).
#5 Le 23/02/2020, à 17:10
- kamaris
Re : [ASTUCE ?] systemd, stop & service
La boucle ne sera pas forcément infinie, si un signal a été envoyé au processus $MAINPID par la commande dans le ExecStop qui précède (je ne sais pas si c'est le cas…).
En tout cas, s'il s'agit d'attendre la fin de $MAINPID, il serait plus simple de faire
ExecStop=/bin/bash -c "wait $MAINPID"
Hors ligne
#6 Le 23/02/2020, à 18:00
- katian
Re : [ASTUCE ?] systemd, stop & service
bruno, le serveur minecraft est assez mal fait je trouve, je trouvais moins efficace de faire
ExecStop=/bin/sleep 10
merc kamaris je vais essayer ce wait
Dernière modification par katian (Le 23/02/2020, à 18:01)
Hors ligne
#7 Le 23/02/2020, à 18:25
- katian
Re : [ASTUCE ?] systemd, stop & service
ExecStop=/bin/bash -c "wait $MAINPID"
ne fonctionne pas
mc_server@survival.service - Minecraft server: survival
Loaded: loaded (/etc/systemd/system/mc_server@.service; indirect; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2020-02-23 18:11:12 CET; 22s ago
Process: 5042 ExecStop=/bin/bash -c wait $MAINPID (code=exited, status=127)
Process: 5041 ExecStop=/usr/bin/screen -p 0 -S mc-survival -X stuff stop^M (code=exited, status=0/SUCCESS)
Process: 5006 ExecStart=/usr/bin/screen -DmS mc-survival /usr/bin/java -Xmx4G -Xms2G -jar /home/mc_user/mc_server/server.jar nogui (code=exited, status=1/FAILURE)
Main PID: 5006 (code=exited, status=1/FAILURE)
je ferais d'autre essais plus tard
pour l'instant
ExecStop=/bin/bash -c "while ps -p $MAINPID > /dev/null; do /bin/sleep 1; done"
ne pause aucun soucis
Hors ligne
#8 Le 23/02/2020, à 18:42
- kamaris
Re : [ASTUCE ?] systemd, stop & service
Ah excuse-moi, j'ai dit une bêtise : wait est fait pour attendre la fin des processus fils du shell uniquement.
Dans ton cas, ce serait plutôt
ExecStop=/bin/bash -c "tail --pid=$MAINPID -f /dev/null"
Hors ligne
#9 Le 23/02/2020, à 18:45
- katian
Re : [ASTUCE ?] systemd, stop & service
ok merci kamaris je ferais un essai
Hors ligne