La Fibre
		Télécom => Logiciels et systèmes d'exploitation =>  Linux (usage serveur) => Discussion démarrée par: vivien le 07 avril 2019 à 11:08:23
 Linux (usage serveur) => Discussion démarrée par: vivien le 07 avril 2019 à 11:08:23
		
			
			- 
				Quand je redémarre un serveur, j'ai de nombreuses minutes de blocage lié à l'erreur "Failed unmounting /home"
 
 J'aimerais bien comprendre à quoi est du cette erreur.
 Je ne vois rien dans /var/log/kern.log ou /var/log syslog, où trouver le log pour comprendre à quoi est du l’erreur ?
 
 J'ai pensé au débit que l'erreur était lié aux deux ramdisque (tmpfs) qui étaient dans /home pour nPerf et speedtest. J'ai donc déplacé ces ramdisque tmpfs à la racine, mais /home est toujours en erreur.
 
 (https://lafibre.info/testdebit/ubuntu/201804_failed_unmouting_home.png)
- 
				Surement un process non arrêté.
 
 Insère un script d'arrêt avec un lsof sur /home le plus près possible du démontage.
- 
				Je ne vois rien dans /var/log/kern.log ou /var/log syslog, où trouver le log pour comprendre à quoi est du l’erreur ?
 
 
 en 2019 si t'es sous systemd tout est en dans journalctl , t'as pas besoin d'utiliser d'autre commande que journatctl (meme dmesg est inclus la dedans).
 
 Suivant la config par défaut de ta distrib, elle conserve ou pas les journaux des boots précédents:
 
 sudo journalctl --list-boots
 te permet de voir cela (suivant tes réglages de sécu le sudo peut-etre omis). Si ta distrib ne le fait pas défaut: https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs
 
 Ensuite "sudo journalctl -b -1" par exemple permet de voir tout les logs du boot précédent (shift-g pour aller a la fin puis tu peux remonter, / pour chercher une chaine, h pour voir l'aide).
 
 Il y a plein d'options pour faciliter la recherche et filtrer, par exemple "sudo journalctl -b -1 -p 3" n'affiche que les erreurs ou plus grave.
 
 man journalctl  ou des tuto en ligne.
 
 Franchement en 2019, y'a vraiment que 2 commandes d'admin a apprendre et maîtriser sous les distrib Linux systemd: systemctl (controler et gerer les service) et journalctl.
 quasi toutes les distribs majeures l'ont adopté: https://en.wikipedia.org/wiki/Systemd#Adoption
 
 J'en vois trop encore qui continu a utiliser des vielles habitudes sur des distrib qui sont depuis longtemps passé sous systemd. Formez vous au présent ;) le gain de temps est phénoménal ensuite.
 
 
 
 
 
- 
				Surement un process non arrêté.
 
 Insère un script d'arrêt avec un lsof sur /home le plus près possible du démontage.
 
 
 +1 pour lsof, contrôler la liste des processus l'utilisant avant de lancer son arrêt.
 
 Autre solution, passer en single-user pour contrôler avec lsof qui utilise encore /home.
 
- 
				Parfait.
 
 Ubuntu garde les 32 précédents boot (-1 à -32) + l'actuel (0)
 
 C'est bien un process qui bloque :
 avril 07 12:50:05 tests systemd[1]: home.mount: Mount process exited, code=exited status=32
 avril 07 12:50:05 tests systemd[1]: Failed unmounting /home.
 Le process en question, c'est le serveur Ookla.
 
 La documentation donne peu d'information pour le lancer :
 
 Ensure server daemon starts automatically
 
 The OoklaServer Daemon can easily be configured to start automatically. CentOS, Fedora, Debian, and most distributions derived from any of the three, all execute a script called rc.local once all system processes have started. Editing this script to include a reference to the OoklaServer Daemon will cause the daemon to start automatically at boot.
 
 CentOS/Fedora based systems: /etc/rc.d/rc.local
 Debian based systems: /etc/rc.local
 
 If you do not want to run OoklaServer as root (recommended) create a user to run OoklaServer.
 Edit rc.local to include the following command to start the OoklaServer Daemon silently in the background. Change "ooklauser" to your non-root user that will run OoklaServer.
 su ooklauser -c './full_path_to_your_Ookla_Server_Daemon/OoklaServer --daemon'
 
 /etc/rc.local n'existe même plus avec les Ubuntu récents.
 
 Perso j'ai créé un fichier /etc/cron.d/speedtest qui le lance au démarrage et qui vérifie toutes les 5minutes si il est toujours là
 # Auto restart on reboot
 @reboot         speedtest   sleep 1 ; /home/speedtest/check_speedtest.sh
 @reboot         speedtest   sleep 2 ; cp -r /home/speedtest/files/* /home/speedtest/tmpfs
 
 # Auto restart SpeedTest on crash
 */5 * * * *     speedtest   sleep 20 ; /home/speedtest/check_speedtest.sh
 Note: Même sans mon crontab qui se lance toutes les 5 minutes, j'ai le problème.
 
 Le contenu du script lancé :/home/speedtest/check_speedtest.sh
 #!/bin/dash
 if [ `ps -C OoklaServer | wc -l` = "1" ]
 then
 date >> /tmp/plantage_speedtest.log
 cd /home/speedtest/bin
 /home/speedtest/bin/OoklaServer --daemon >> /tmp/plantage_speedtest.log 2>&1
 fi
- 
				encore une fois c'est systemd la solution. /etc/rc, init, cron, etc tout ca c'est dans systemd maintenant.
 
 c'est étonnant et inconséquent de la part de speedtest de ne pas fournit une install propre pour systemd (franchement aller mentionner rc.local c'est de la fainéantise de leur part).
 
 y'a tout ce qu'il faut dans systemd pour lancer un service 'speedtest', le relancer s'il plante , l'arreter proprement au shutdown de la machine.
 
 créer le fichier suivant:  /etc/systemd/system/speedtest.service
 
 avec dedans:
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=simple
 ExecStart=/full_path_to_your_Ookla_Server_Daemon/OoklaServer --daemon
 Restart=always
 RestartSec=15
 User=monuser
 
 [Install]
 WantedBy=multi-user.target
 
 quelques explications:
 
 - La Type=simple indique est le programme a lancer est un executable (ligne ExecStart) qui tourne et ne s'arrete pas.
 Si "OoklaServer --daemon" fork un process et rend la main il faut mettre "ExecStart=forking" et tracker le PID du process dans une option "PIDFile="
 
 - la ligne "User=" est optionnelle et défini le compte utilisateur qui sera utilisé pour faire tourner le service. si tu veux pas que ce soit root.
 
 - RestartSec est le delai en seconde a attendre avant de redémarrer le service
 
 - Restart=always va redemarrer le service s'il est down
 
 - Lors d'un shutdown , systemd va arrêter le service en envoyant un signal d'arret (personalisable). Si cela ne suffit pas a l’arrêter correctement voir https://www.freedesktop.org/software/systemd/man/systemd.kill.html
 
 Pour installer le service:
 
 sudo systemctl daemon-reload   // à faire toutle temps apres une ajout/modif d'un fichier systemd
 sudo systemctl enable speedtest.service // ce activera le service au boot
 
 pour démarrer a la main:
 sudo systemctl start speedtest.service // le .service peut être omis si y'a pas d’ambiguïté avec autre chose
 
 pour voir l'état :
 sudo systemctl status speedtest.service
 
 pour arreter:
 sudo systemctl stop speedtest.service
 
 pour voir le journal concernant ce service depuis le démarrage en cours:
 sudo journalctl -b -u speedtest.service // penser 'u' = unit
 
 pour désactiver le service:
 sudo systemctl disable speedtest.service
 
 pour finir je conseille fortement de lire: https://www.freedesktop.org/software/systemd/man/systemd.service.html et la doc de systemd en général.
 
- 
				Je vois que j'ai oublié de faire un retour.
 
 Le Type=simple ne fonctionne pas pour OoklaServer.
 
 Voici ce que j'ai fait, avec Type=forking
 
 sudo nano /etc/systemd/system/speedtest.service
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=forking
 ExecStart=/home/speedtest/bin/OoklaServer --daemon
 Restart=always
 RestartSec=15
 User=speedtest
 
 [Install]
 WantedBy=multi-user.target
 sudo systemctl daemon-reload
 sudo systemctl enable speedtest.service (pour installer le service)
 sudo reboot
 
 Cela fonctionne bien, le service est bien disponible, mais je n'ai pas réglé mon problème de lenteur au reboot du serveur.
 
 Une petite vidéo pour montrer ça simplement :
 https://lafibre.info/videos/linux/202106_ookla_systemd_speedtest.service_probleme.mp4
- 
				90s est le DefaultTimeoutStopSec du system car y'a pas de TimeoutStopSec defini specifiquement pour ce service.
 
 systemd n'arrive pas arreter proprement le service.
 
 Soit celui-ce ne répond pas correctement a un SIGTERM, systemd attend TimeoutStopSec  (= DefaultTimeoutStopSec si pas défini) avant d'envoyer un SIGKILL
 Soit le forking ne detecte peut-etre pas bien le PID du process (et y'a pas PIDFile)
 
 
 Essai plutôt de ne pas forker:
 type=Simple et enleve le "--daemon"
 
 si ca marche (démarre) mais c'est aussi lent a stopper c'est que le programme ne respecte pas les standards et il faut le tuer violement.
 ajoute un TimeoutStopSec (dans la section [Service]) avec une valeur courte:
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=simple
 ExecStart=/home/speedtest/bin/OoklaServer
 Restart=always
 RestartSec=15
 User=speedtest
 TimeoutStopSec=10s
 [Install]
 WantedBy=multi-user.target
 
 sinon reste en Type=forking mais passe un PID a systemd:
 
 ajoute "--pidfile=/run/OoklaServer.pid" a la fin de l'ExecStart (a priori OoklaServer supporte cet option)
 ainsi que: PIDFile=OoklaServer.pid
 
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=forking
 ExecStart=/home/speedtest/bin/OoklaServer --daemon --pidfile=/run/OoklaServer.pid
 PIDFile=OoklaServer.pid
 Restart=always
 RestartSec=15
 User=speedtest
 TimeoutStopSec=90s
 [Install]
 WantedBy=multi-user.target
 s'il s'arrete pas rapidement non plus, change 90s a un 10s par exemple.
 tu peux tester avec "systemctl start/stop speedtest" plutot que rebooter le serveur.
 
 La méthode "Type=simple" est quand meme plus recommandée car plus moderne.
- 
				Essai plutôt de ne pas forker:
 type=Simple et enleve le "--daemon"
 Cela ne change rien, il n'arrive pas à terminer le programme.
 
 ajoute un TimeoutStopSec (dans la section [Service]) avec une valeur courte: Cela permet de réduire bien le délais.
 
 sinon reste en Type=forking mais passe un PID a systemd:
 
 ajoute "--pidfile=/run/OoklaServer.pid" a la fin de l'ExecStart (a priori OoklaServer supporte cet option)
 ainsi que: PIDFile=OoklaServer.pid
 Là OoklaServer ne fonctionne pas.
 
 Il faut ouvrir des droit pour pouvoir écrit sur /run/OoklaServer.pid ?
 
 $ sudo service speedtest status
 ● speedtest.service - service speedtest Ookla
 Loaded: loaded (/etc/systemd/system/speedtest.service; enabled; vendor preset: enabled)
 Active: activating (start) since Sun 2021-06-20 15:22:39 UTC; 1min 20s ago
 Process: 694 ExecStart=/home/speedtest/bin/OoklaServer --daemon --pidfile=/run/OoklaServer.pid (code=exited, status=0/SUCCESS)
 Tasks: 1 (limit: 9339)
 Memory: 6.3M
 CGroup: /system.slice/speedtest.service
 └─737 /home/speedtest/bin/OoklaServer --daemon --pidfile=/run/OoklaServer.pid
 
 juin 20 15:22:39 hp systemd[1]: Starting service speedtest Ookla...
 juin 20 15:22:39 hp systemd[1]: speedtest.service: Can't open PID file /run/OoklaServer.pid (yet?) after start: Operation not permitted
- 
				revient comme avant et met juste un TimeoutStopSec dans ce cas. le programme est mal écrit ou faut co,nfigurer ton compte utilisateur.
 
- 
				En utilisant le PID existant le serveur se lance bien, mais met toujours du temps pour s’arrêter :
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=forking
 ExecStart=/home/speedtest/bin/OoklaServer --daemon --pidfile=/home/speedtest/bin/OoklaServer.pid
 PIDFile=/home/speedtest/bin/OoklaServer.pid
 Restart=always
 RestartSec=15
 User=speedtest
 TimeoutStopSec=60s
 
 [Install]
 WantedBy=multi-user.target
 Il y a en effet un fichier /home/speedtest/bin/OoklaServer.pid existant :
 
 $ ls -l /home/speedtest/bin/
 total 17644
 -rwxr-xr-x 1 speedtest speedtest 18044475 juin  16  2020 OoklaServer
 -rw-r----- 1 speedtest speedtest        4 juin  20 16:06 OoklaServer.pid
 -rw-r--r-- 1 speedtest speedtest     3897 juin  19 20:41 OoklaServer.properties
 -rw-r--r-- 1 speedtest speedtest     3907 juin  16  2020 OoklaServer.properties.default
 -rwxrwxr-x 1 speedtest speedtest     6708 août  15  2018 ooklaserver.sh
 
 Je découvre aussi un /home/speedtest/bin/ooklaserver.sh qu'il ont eu la bonne idée de rajouter pour gérer le serveur.
 
 Voici son contenu :
 #!/bin/sh
 # OoklaServer install and management script
 BASE_DOWNLOAD_PATH='https://install.speedtest.net/ooklaserver/stable/'
 INSTALL_DIR=''
 DAEMON_FILE='OoklaServer'
 PID_FILE="$DAEMON_FILE.pid"
 
 
 display_usage() {
 echo "This script can be used to install or control a Ookla Server."
 echo  "Usage:"
 echo  "$0 [-f|--force] [-i|--installdir <dir>] command"
 echo  ""
 echo  "  Valid commands: install, start, stop, restart"
 echo  "   install - downloads and installs the Ookla server"
 echo  "   start   - starts the server if not running"
 echo  "   stop    - stops the server if running"
 echo  "   restart - stops the server if running, and restarts it"
 echo  " "
 echo  "  -f|--force           Do not prompt before install"
 echo  "  -i|--install <dir>   Install to specified folder instead of the current folder"
 echo  "  -h|--help            This help"
 echo  ""
 }
 
 has_command() {
 type "$1" >/dev/null 2>&1
 }
 
 detect_platform() {
 # detect operating system
 case $( uname -s ) in
 Darwin)
 server_package='macosx'
 ;;
 Linux)
 server_package='linux32'
 arch=`uname -m`
 if [ "$arch" = "x86_64" ]; then
 server_package='linux64'
 fi
 ;;
 FreeBSD)
 server_package='freebsd32'
 arch=`uname -m`
 if [ "$arch" = "amd64" ]; then
 server_package='freebsd64'
 fi
 ;;
 *)
 echo "Please Select the server Platform : "
 echo "1) macOS"
 echo "2) Linux (32bit)"
 echo "3) Linux (64bit)"
 echo "4) FreeBSD (32bit)"
 echo "5) FreeBSD (64bit)"
 
 read n
 case $n in
 1) server_package='macosx';;
 2) server_package='linux32';;
 3) server_package='linux64';;
 4) server_package='freebsd32';;
 5) server_package='freebsd64';;
 esac
 esac
 
 echo "Server Platform is $server_package"
 }
 
 confirm_install() {
 if [ "$INSTALL_DIR" != "" ]; then
 printf "This will install the Ookla server for $server_package to folder $INSTALL_DIR. Please confirm (y/n) > "
 else
 printf "This will install the Ookla server for $server_package to the current folder. Please confirm (y/n) > "
 fi
 read response
 if [ "$response" != "y" ]; then
 echo "Exiting program."
 exit 1
 fi
 }
 
 goto_speedtest_folder() {
 # determine if base install folder exists
 dir_full=`pwd`
 dir_base=`basename $dir_full`
 
 echo "Checking Directory Structure"
 if [ "$INSTALL_DIR" != "" ]; then
 if [ "$dir_base" != "$INSTALL_DIR" ]; then
 if [ ! -d "$INSTALL_DIR" ]; then
 mkdir "$INSTALL_DIR"
 scriptname=`basename $0`
 # copy script to folder
 cp "$scriptname" "$INSTALL_DIR"
 fi
 
 cd "$INSTALL_DIR"
 fi
 fi
 }
 
 download_install() {
 # download the v3 server files with either wget or curl or fetch
 gzip_download_file="OoklaServer-$server_package.tgz"
 gzip_download_url="$BASE_DOWNLOAD_PATH$gzip_download_file"
 
 curl_path=`command -v curl`
 wget_path=`command -v wget`
 fetch_path=`command -v fetch`
 
 echo "Downloading Server Files"
 if [ -n "$curl_path" ]; then
 curl -O $gzip_download_url
 
 elif [ -n "$wget_path" ]; then
 wget "$gzip_download_url" -O "$gzip_download_file"
 
 elif [ -n "$fetch_path" ]; then
 # fetch is found in base OS in FreeBSD
 fetch -o "$gzip_download_file" "$gzip_download_url"
 else
 echo "This script requires CURL or WGET or FETCH"
 exit 1
 fi
 
 # extract package
 if [ -f "$gzip_download_file" ]; then
 echo "Extracting Server Files"
 tar -zxovf "$gzip_download_file"
 rm "$gzip_download_file"
 if [ ! -f "${DAEMON_FILE}.properties" ]; then
 cp "${DAEMON_FILE}.properties.default" "${DAEMON_FILE}.properties"
 fi
 else
 echo "Error download server package"
 exit 1
 fi
 
 }
 
 restart_if_running() {
 stop_if_running
 start
 }
 
 stop_process() {
 daemon_pid="$1"
 printf "Stopping $DAEMON_FILE Daemon ($daemon_pid)"
 kill "$daemon_pid" >/dev/null 2>&1
 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
 if kill -0 "$daemon_pid" >/dev/null 2>&1 ; then
 sleep 1
 printf " ."
 else
 break
 fi
 done
 echo ""
 }
 
 stop_if_running() {
 if [ -f "$PID_FILE" ]; then
 daemon_pid=`cat $PID_FILE`
 if [ $daemon_pid ]; then
 stop_process "$daemon_pid"
 if has_command pgrep; then
 pids=$(pgrep OoklaServer 2>&1)
 if [ -n "$pids" ]; then
 echo "Additional $DAEMON_FILE processes running; stopping"
 for daemon_pid in $pids; do
 stop_process "$daemon_pid"
 done
 pids=$(pgrep OoklaServer 2>&1)
 if [ -n "$pids" ]; then
 echo "Lingering $DAEMON_FILE processes running; killing ($pids)"
 kill -9 $pids
 fi
 fi
 fi
 fi
 fi
 }
 
 start_if_not_running() {
 if [ -f "$PID_FILE" ]; then
 daemon_pid=`cat $PID_FILE`
 if [ $daemon_pid ]; then
 if kill -0 "$daemon_pid" > /dev/null 2>&1 ; then
 echo "$DAEMON_FILE ($daemon_pid) is already running"
 exit 1
 fi
 fi
 fi
 start
 }
 
 start() {
 printf "Starting $DAEMON_FILE"
 dir_full=`pwd`
 if [ -f "$DAEMON_FILE" ]; then
 chmod +x "$DAEMON_FILE"
 daemon_cmd="./$DAEMON_FILE --daemon --pidfile=$dir_full/$PID_FILE"
 # echo "$daemon_cmd"
 `$daemon_cmd`
 else
 echo ""
 echo "Daemon not installed. Please run install first."
 exit 1
 fi
 
 # wait for PID file to be created and verify daemon started
 
 for i in 1 2 3 4 5 6 7 8 9 10; do
 sleep 1
 if [ -f "$PID_FILE" ]; then break; fi
 printf " ."
 done
 echo ""
 if [ -f "$PID_FILE" ]; then
 daemon_pid=`cat $PID_FILE`
 echo "Daemon Started ($daemon_pid)"
 else
 echo "Failed to Start Daemon"
 fi
 }
 
 ##### Main
 
 prompt=1
 action=help
 while [ "$1" != "" ]; do
 case $1 in
 install )				action=install
 ;;
 stop )					action=stop
 ;;
 start )					action=start
 ;;
 restart )				action=restart
 ;;
 help )					action=help
 ;;
 -i | --installdir )        shift
 INSTALL_DIR=$1
 ;;
 -f | --force )    		prompt=0
 ;;
 -h | --help )           display_usage
 exit
 ;;
 * )                     display_usage
 exit 1
 esac
 shift
 done
 
 if [ "$action" = "restart" ]; then
 restart_if_running
 fi
 
 if [ "$action" = "start" ]; then
 start_if_not_running
 fi
 
 if [ "$action" = "stop" ]; then
 stop_if_running
 fi
 
 
 if [ "$action" = "help" ]; then
 display_usage
 fi
 
 if [ "$action" = "install" ]; then
 detect_platform
 if [ "$prompt" = "1" ]; then
 confirm_install
 fi
 
 goto_speedtest_folder
 
 download_install
 
 restart_if_running
 
 echo "NOTE:"
 echo ""
 echo "We strongly recommend following instructions at"
 echo ""
 echo "   https://www.ookla.com/support/a87011938/"
 echo ""
 echo "to ensure your daemon starts automatically when the system reboots"
 echo ""
 fi
- 
				L'inconvient de mettre le fichier pid a cet endroit est qu'en cas de reboot violent du serveur ce fichier n'est pas supprimé ce qui pourrait empêcher le service de démarrer.
 
 Il faudrait tester si la présence du fichier pid avant le lancement du programme gene ou pas.
 
 L'avantage de /run est qu'il n'est pas permanent et ne survie pas a un reboot donc le fichier pid est supprimé meme en cas de reboot violent (coupure électrique par exemple).
 
 essai plutôt avec le dossier /run/user/xxxxx (ou xxxx est le résultat de 'id -u speedtest').
- 
				# id -u speedtest
 1001
 /run/user/1001 n'est pas crée automatiquement, il y a juste /run/user/1000 c'est à moi de le créer et de lui sonner les droits ?
 
 Le fichier /home/speedtest/bin/OoklaServer.pid a été crée par le programme d'installation et pas mis à jour ensuite, il contient le ID du premier lancement.
 
 Je me demande si on ne peut pas reprendre des bout de code du script qui permet de lancer / arrêter le serveur :
 
 Start:
 start() {
 printf "Starting $DAEMON_FILE"
 dir_full=`pwd`
 if [ -f "$DAEMON_FILE" ]; then
 chmod +x "$DAEMON_FILE"
 daemon_cmd="./$DAEMON_FILE --daemon --pidfile=$dir_full/$PID_FILE"
 # echo "$daemon_cmd"
 `$daemon_cmd`
 else
 echo ""
 echo "Daemon not installed. Please run install first."
 exit 1
 fi
 
 # wait for PID file to be created and verify daemon started
 
 for i in 1 2 3 4 5 6 7 8 9 10; do
 sleep 1
 if [ -f "$PID_FILE" ]; then break; fi
 printf " ."
 done
 echo ""
 if [ -f "$PID_FILE" ]; then
 daemon_pid=`cat $PID_FILE`
 echo "Daemon Started ($daemon_pid)"
 else
 echo "Failed to Start Daemon"
 fi
 }
 
 Stop :
 stop_process() {
 daemon_pid="$1"
 printf "Stopping $DAEMON_FILE Daemon ($daemon_pid)"
 kill "$daemon_pid" >/dev/null 2>&1
 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
 if kill -0 "$daemon_pid" >/dev/null 2>&1 ; then
 sleep 1
 printf " ."
 else
 break
 fi
 done
 echo ""
 }
 
 stop_if_running() {
 if [ -f "$PID_FILE" ]; then
 daemon_pid=`cat $PID_FILE`
 if [ $daemon_pid ]; then
 stop_process "$daemon_pid"
 if has_command pgrep; then
 pids=$(pgrep OoklaServer 2>&1)
 if [ -n "$pids" ]; then
 echo "Additional $DAEMON_FILE processes running; stopping"
 for daemon_pid in $pids; do
 stop_process "$daemon_pid"
 done
 pids=$(pgrep OoklaServer 2>&1)
 if [ -n "$pids" ]; then
 echo "Lingering $DAEMON_FILE processes running; killing ($pids)"
 kill -9 $pids
 fi
 fi
 fi
 fi
 fi
 }
- 
				Ce code fait rien de plus qu'un kill (sigterm) puis un kill -9 (sigkill) après 20 secondes. il cherche ensuite tous les process nommés 'OoklaServer' et les tue.
 
 Ca reviendra au meme de faire la version type=Simple avec TimeoutStopSec=20s.
 
 tu peux éventuellement ajouté "ExitType=cgroup" si le programme crée plusieurs process.
 
 Franchement si ton serveur ne reboot pas souvent et si tuer le service violement (kill) ne pose pas de problème. La méthode type=simple reste la plus simple.
 
 apres tu peux utiliser le script en le mettant dans ExecStop.
 
 
- 
				si le programme crée plusieurs process. 
 Si je fais un ps -ef je ne vois que deux process :
 
 # ps -ef | grep Ookla
 speedte+  1388     1  0 juin10 ?       00:00:27 /home/speedtest/bin/OoklaServer --daemon
 root      4509  4482  0 20:50 pts/0    00:00:00 grep --color=auto Ookla
 speedte+ 10089  1388 25 juin11 ?       2-15:08:04 /home/speedtest/bin/OoklaServer --ward --server-id=78c4e3dc-26df-4d60-957e-c49eb1cf5e67
 Si je fais htop : (le serveur a aussi nPerf qui tourne)
 (https://lafibre.info/testdebit/ubuntu/202106_htop_speedtest_nperf.png)
- 
				c'est des process indépendants ou ont-ils tous le meme parent que le process qui a le pid dans le fichier ?
 
 "ps faux" ca donne quoi ?
 
 et compare avec le contenu de /home/speedtest/bin/OoklaServer.pid
 
 
 
- 
				OoklaServer.pid est pas mis à jour, car je n'utilise pas leur script. Il contient un seul pid.
 
 Comparaison Ookla / nPerf / Apache :
 # ps faux | grep Ookla
 speedte+  1388  0.0  0.0 203372    40 ?        Ssl  juin10   0:27 /home/speedtest/bin/OoklaServer --daemon
 speedte+ 10089 25.9  1.0 4554532 343880 ?      Sl   juin11 3806:23  \_ /home/speedtest/bin/OoklaServer --ward --server-id=78c4e3dc-26df-4d60-957e-c49eb1cf5e67
 
 # ps faux | grep nperf
 nperf-s+ 19091 21.6  0.4 994332 137364 ?       Ssl  juin18 1077:29 /usr/bin/nPerfServer -x --pidfile=/var/lib/nperf-server/nPerfServer.pid -p 8081 -t 8443 --uuidfile=/var/lib/nperf-server/nPerfServer.uuid -i ::
 
 # ps faux | grep apache
 root      1804  0.0  0.0 337464 19072 ?        Ss   juin10   0:46 /usr/sbin/apache2 -k start
 www-data 19260  0.0  0.0 345028 19340 ?        S    05:54   0:07  \_ /usr/sbin/apache2 -k start
 www-data 19261  0.0  0.0 344996 20604 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19262  0.0  0.0 344980 19524 ?        S    05:54   0:07  \_ /usr/sbin/apache2 -k start
 www-data 19263  0.0  0.0 344952 20316 ?        S    05:54   0:07  \_ /usr/sbin/apache2 -k start
 www-data 19264  0.0  0.0 345012 20068 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19265  0.0  0.0 345024 18928 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19266  0.0  0.0 345036 20044 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19267  0.0  0.0 344992 18884 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19268  0.0  0.0 345000 20944 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19269  0.0  0.0 345008 19640 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19270  0.0  0.0 345020 20028 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19271  0.0  0.0 345000 19412 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19272  0.0  0.0 345000 19784 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19273  0.0  0.0 344864 19712 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19274  0.0  0.0 345024 18868 ?        S    05:54   0:07  \_ /usr/sbin/apache2 -k start
 www-data 19275  0.0  0.0 345024 19168 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19276  0.0  0.0 344932 20216 ?        S    05:54   0:10  \_ /usr/sbin/apache2 -k start
 www-data 19277  0.0  0.0 345004 18912 ?        S    05:54   0:10  \_ /usr/sbin/apache2 -k start
 www-data 19278  0.0  0.0 344832 19616 ?        S    05:54   0:10  \_ /usr/sbin/apache2 -k start
 www-data 19279  0.0  0.0 344948 19872 ?        S    05:54   0:07  \_ /usr/sbin/apache2 -k start
 www-data 19280  0.0  0.0 344996 20044 ?        S    05:54   0:10  \_ /usr/sbin/apache2 -k start
 www-data 19281  0.0  0.0 345020 20020 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19282  0.0  0.0 345008 21052 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19283  0.0  0.0 345004 20872 ?        S    05:54   0:11  \_ /usr/sbin/apache2 -k start
 www-data 19284  0.0  0.0 345164 19928 ?        S    05:54   0:09  \_ /usr/sbin/apache2 -k start
 www-data 19285  0.0  0.0 345016 18900 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19287  0.0  0.0 345004 20016 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19289  0.0  0.0 345016 20660 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 19291  0.0  0.0 345020 19732 ?        S    05:54   0:07  \_ /usr/sbin/apache2 -k start
 www-data 19293  0.0  0.0 344896 19800 ?        S    05:54   0:08  \_ /usr/sbin/apache2 -k start
 www-data 23013  0.0  0.0 345044 19712 ?        S    06:48   0:09  \_ /usr/sbin/apache2 -k start
 www-data 23014  0.0  0.0 344940 19780 ?        S    06:48   0:09  \_ /usr/sbin/apache2 -k start
 www-data 23015  0.0  0.0 344992 19944 ?        S    06:48   0:08  \_ /usr/sbin/apache2 -k start
 www-data 25656  0.0  0.0 345008 19160 ?        S    07:36   0:09  \_ /usr/sbin/apache2 -k start
 www-data 25657  0.0  0.0 345004 19748 ?        S    07:36   0:06  \_ /usr/sbin/apache2 -k start
 www-data 30337  0.0  0.0 345620 20392 ?        S    09:00   0:08  \_ /usr/sbin/apache2 -k start
 www-data 30944  0.0  0.0 344932 19784 ?        S    09:11   0:07  \_ /usr/sbin/apache2 -k start
 www-data 31703  0.0  0.0 344868 18920 ?        S    09:28   0:06  \_ /usr/sbin/apache2 -k start
 www-data 31704  0.0  0.0 344948 19148 ?        S    09:28   0:09  \_ /usr/sbin/apache2 -k start
 www-data 31711  0.0  0.0 344952 19604 ?        S    09:30   0:07  \_ /usr/sbin/apache2 -k start
 www-data  9704  0.0  0.0 344888 19140 ?        S    12:39   0:06  \_ /usr/sbin/apache2 -k start
 www-data  9705  0.0  0.0 344888 19716 ?        S    12:39   0:07  \_ /usr/sbin/apache2 -k start
 www-data  9706  0.0  0.0 344884 18788 ?        S    12:39   0:07  \_ /usr/sbin/apache2 -k start
 www-data 17893  0.0  0.0 344796 19532 ?        S    15:07   0:04  \_ /usr/sbin/apache2 -k start
 www-data 17894  0.0  0.0 344860 18772 ?        S    15:07   0:03  \_ /usr/sbin/apache2 -k start
 www-data 17895  0.0  0.0 344808 19472 ?        S    15:07   0:04  \_ /usr/sbin/apache2 -k start
 
- 
				donc y'a bien une hiérarchie de processes. 
 pstree -ap 1388  
 
devrait l'afficher.
 
 si tu fais "kill -0 1388" cela arrete t'il bien tout les process ?
 
 dans ce cas il manque juste "ExitType=cgroup" dans le fichier .service:
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=simple
 ExecStart=/home/speedtest/bin/OoklaServer
 ExitType=cgroup
 Restart=always
 RestartSec=15
 User=speedtest
 TimeoutStopSec=90s
 [Install]
 WantedBy=multi-user.target
 si l'arret du service met encore 90s dans cas y'a que la solution de mettre TimeoutStopSec a 10s.
- 
				kill -0 1388 ne kill rien du tout, c'est inefficace pour ce process.
 
 J'ai tenté plusieurs fois, mais il est toujours là avec ses petits.
 
 donc y'a bien une hiérarchie de processes. 
 pstree -ap 1388  
 
devrait l'afficher.
 # pstree -ap 1388  
 OoklaServer,1388 --daemon
 ├─OoklaServer,10089 --ward --server-id=78c4e3dc-26df-4d60-957e-c49eb1cf5e67
 │   ├─{OoklaServer},10090
 │   ├─{OoklaServer},10091
 │   ├─{OoklaServer},10092
 │   ├─{OoklaServer},10093
 │   ├─{OoklaServer},10094
 │   ├─{OoklaServer},10095
 │   ├─{OoklaServer},10096
 │   ├─{OoklaServer},10097
 │   ├─{OoklaServer},10098
 │   ├─{OoklaServer},10099
 │   ├─{OoklaServer},10100
 │   ├─{OoklaServer},10101
 │   ├─{OoklaServer},10102
 │   ├─{OoklaServer},10103
 │   ├─{OoklaServer},10104
 │   ├─{OoklaServer},10105
 │   ├─{OoklaServer},10106
 │   ├─{OoklaServer},10107
 │   ├─{OoklaServer},10108
 │   ├─{OoklaServer},10109
 │   ├─{OoklaServer},10110
 │   ├─{OoklaServer},10111
 │   ├─{OoklaServer},10112
 │   ├─{OoklaServer},10113
 │   ├─{OoklaServer},10114
 │   ├─{OoklaServer},10115
 │   ├─{OoklaServer},10116
 │   ├─{OoklaServer},10117
 │   ├─{OoklaServer},10118
 │   ├─{OoklaServer},10119
 │   ├─{OoklaServer},10120
 │   ├─{OoklaServer},10121
 │   ├─{OoklaServer},10122
 │   ├─{OoklaServer},10123
 │   ├─{OoklaServer},10124
 │   ├─{OoklaServer},10125
 │   ├─{OoklaServer},10126
 │   ├─{OoklaServer},10127
 │   ├─{OoklaServer},10128
 │   ├─{OoklaServer},10129
 │   ├─{OoklaServer},10130
 │   ├─{OoklaServer},10131
 │   ├─{OoklaServer},10132
 │   ├─{OoklaServer},5653
 │   ├─{OoklaServer},14178
 │   ├─{OoklaServer},2652
 │   ├─{OoklaServer},4214
 │   ├─{OoklaServer},4217
 │   ├─{OoklaServer},4233
 │   ├─{OoklaServer},5934
 │   ├─{OoklaServer},5942
 │   ├─{OoklaServer},7093
 │   ├─{OoklaServer},7094
 │   ├─{OoklaServer},7615
 │   ├─{OoklaServer},7642
 │   ├─{OoklaServer},8517
 │   ├─{OoklaServer},8520
 │   ├─{OoklaServer},8525
 │   ├─{OoklaServer},9285
 │   ├─{OoklaServer},9293
 │   ├─{OoklaServer},9300
 │   ├─{OoklaServer},9312
 │   ├─{OoklaServer},11875
 │   ├─{OoklaServer},17661
 │   ├─{OoklaServer},17668
 │   ├─{OoklaServer},17674
 │   ├─{OoklaServer},17675
 │   ├─{OoklaServer},17684
 │   ├─{OoklaServer},17700
 │   ├─{OoklaServer},17702
 │   ├─{OoklaServer},17705
 │   ├─{OoklaServer},17706
 │   ├─{OoklaServer},17708
 │   ├─{OoklaServer},17713
 │   ├─{OoklaServer},17714
 │   ├─{OoklaServer},17723
 │   ├─{OoklaServer},17810
 │   ├─{OoklaServer},17813
 │   ├─{OoklaServer},17829
 │   ├─{OoklaServer},17831
 │   ├─{OoklaServer},17881
 │   ├─{OoklaServer},17884
 │   ├─{OoklaServer},17885
 │   ├─{OoklaServer},17889
 │   ├─{OoklaServer},17890
 │   ├─{OoklaServer},17900
 │   ├─{OoklaServer},17903
 │   ├─{OoklaServer},18006
 │   ├─{OoklaServer},18023
 │   ├─{OoklaServer},18029
 │   ├─{OoklaServer},18038
 │   ├─{OoklaServer},18049
 │   ├─{OoklaServer},18063
 │   ├─{OoklaServer},18075
 │   ├─{OoklaServer},19585
 │   ├─{OoklaServer},19589
 │   ├─{OoklaServer},19591
 │   ├─{OoklaServer},19593
 │   ├─{OoklaServer},19594
 │   ├─{OoklaServer},19595
 │   ├─{OoklaServer},19596
 │   ├─{OoklaServer},19599
 │   ├─{OoklaServer},19600
 │   ├─{OoklaServer},19607
 │   ├─{OoklaServer},19609
 │   ├─{OoklaServer},19610
 │   ├─{OoklaServer},19611
 │   ├─{OoklaServer},19612
 │   ├─{OoklaServer},19613
 │   ├─{OoklaServer},19616
 │   ├─{OoklaServer},19617
 │   ├─{OoklaServer},19622
 │   ├─{OoklaServer},19628
 │   ├─{OoklaServer},19629
 │   ├─{OoklaServer},19631
 │   ├─{OoklaServer},19632
 │   ├─{OoklaServer},19636
 │   ├─{OoklaServer},19637
 │   ├─{OoklaServer},19640
 │   ├─{OoklaServer},19641
 │   ├─{OoklaServer},20246
 │   ├─{OoklaServer},20247
 │   ├─{OoklaServer},20249
 │   ├─{OoklaServer},20250
 │   ├─{OoklaServer},20252
 │   ├─{OoklaServer},20254
 │   ├─{OoklaServer},20256
 │   ├─{OoklaServer},22025
 │   ├─{OoklaServer},22026
 │   ├─{OoklaServer},22029
 │   ├─{OoklaServer},22030
 │   ├─{OoklaServer},22031
 │   ├─{OoklaServer},22033
 │   ├─{OoklaServer},22035
 │   ├─{OoklaServer},22036
 │   ├─{OoklaServer},22038
 │   ├─{OoklaServer},22040
 │   ├─{OoklaServer},22041
 │   ├─{OoklaServer},22045
 │   ├─{OoklaServer},22046
 │   ├─{OoklaServer},22047
 │   ├─{OoklaServer},22048
 │   ├─{OoklaServer},22049
 │   ├─{OoklaServer},22050
 │   ├─{OoklaServer},22055
 │   ├─{OoklaServer},22061
 │   ├─{OoklaServer},23526
 │   ├─{OoklaServer},23527
 │   ├─{OoklaServer},23528
 │   ├─{OoklaServer},23530
 │   ├─{OoklaServer},23531
 │   ├─{OoklaServer},23533
 │   ├─{OoklaServer},23534
 │   ├─{OoklaServer},23535
 │   ├─{OoklaServer},23536
 │   ├─{OoklaServer},23537
 │   ├─{OoklaServer},23538
 │   ├─{OoklaServer},23539
 │   ├─{OoklaServer},23541
 │   ├─{OoklaServer},30013
 │   ├─{OoklaServer},30015
 │   ├─{OoklaServer},30017
 │   ├─{OoklaServer},30018
 │   ├─{OoklaServer},30019
 │   ├─{OoklaServer},30020
 │   ├─{OoklaServer},30021
 │   ├─{OoklaServer},30023
 │   ├─{OoklaServer},30024
 │   ├─{OoklaServer},30025
 │   ├─{OoklaServer},30026
 │   ├─{OoklaServer},30027
 │   ├─{OoklaServer},30028
 │   ├─{OoklaServer},30029
 │   ├─{OoklaServer},30030
 │   ├─{OoklaServer},30031
 │   ├─{OoklaServer},30032
 │   ├─{OoklaServer},30033
 │   ├─{OoklaServer},30034
 │   ├─{OoklaServer},30039
 │   ├─{OoklaServer},30040
 │   ├─{OoklaServer},30042
 │   ├─{OoklaServer},30043
 │   ├─{OoklaServer},30044
 │   ├─{OoklaServer},30046
 │   ├─{OoklaServer},30094
 │   ├─{OoklaServer},30095
 │   ├─{OoklaServer},30097
 │   ├─{OoklaServer},30141
 │   ├─{OoklaServer},30147
 │   ├─{OoklaServer},30148
 │   ├─{OoklaServer},30149
 │   ├─{OoklaServer},30150
 │   ├─{OoklaServer},30152
 │   ├─{OoklaServer},30153
 │   ├─{OoklaServer},30193
 │   ├─{OoklaServer},30197
 │   ├─{OoklaServer},30199
 │   ├─{OoklaServer},30200
 │   ├─{OoklaServer},30201
 │   ├─{OoklaServer},30202
 │   ├─{OoklaServer},30203
 │   ├─{OoklaServer},30204
 │   ├─{OoklaServer},30205
 │   ├─{OoklaServer},30206
 │   ├─{OoklaServer},30208
 │   ├─{OoklaServer},30209
 │   ├─{OoklaServer},30210
 │   ├─{OoklaServer},30211
 │   ├─{OoklaServer},30212
 │   ├─{OoklaServer},30217
 │   ├─{OoklaServer},30218
 │   ├─{OoklaServer},30219
 │   ├─{OoklaServer},30220
 │   ├─{OoklaServer},30221
 │   ├─{OoklaServer},30222
 │   ├─{OoklaServer},30226
 │   ├─{OoklaServer},30227
 │   ├─{OoklaServer},30228
 │   ├─{OoklaServer},30229
 │   ├─{OoklaServer},30230
 │   ├─{OoklaServer},30231
 │   ├─{OoklaServer},30232
 │   ├─{OoklaServer},30256
 │   ├─{OoklaServer},30257
 │   ├─{OoklaServer},30258
 │   ├─{OoklaServer},30259
 │   ├─{OoklaServer},30260
 │   ├─{OoklaServer},30262
 │   ├─{OoklaServer},17333
 │   ├─{OoklaServer},17334
 │   ├─{OoklaServer},17335
 │   ├─{OoklaServer},17336
 │   ├─{OoklaServer},17339
 │   ├─{OoklaServer},17340
 │   ├─{OoklaServer},17343
 │   ├─{OoklaServer},17344
 │   ├─{OoklaServer},17345
 │   ├─{OoklaServer},17346
 │   ├─{OoklaServer},17347
 │   ├─{OoklaServer},17348
 │   ├─{OoklaServer},17349
 │   ├─{OoklaServer},17351
 │   ├─{OoklaServer},17353
 │   ├─{OoklaServer},17355
 │   ├─{OoklaServer},17356
 │   ├─{OoklaServer},17357
 │   ├─{OoklaServer},17358
 │   ├─{OoklaServer},17359
 │   ├─{OoklaServer},17360
 │   ├─{OoklaServer},17361
 │   ├─{OoklaServer},30724
 │   ├─{OoklaServer},30725
 │   ├─{OoklaServer},5035
 │   ├─{OoklaServer},5036
 │   ├─{OoklaServer},5037
 │   ├─{OoklaServer},5038
 │   ├─{OoklaServer},5039
 │   ├─{OoklaServer},5040
 │   ├─{OoklaServer},5041
 │   ├─{OoklaServer},5042
 │   ├─{OoklaServer},5043
 │   ├─{OoklaServer},5044
 │   ├─{OoklaServer},5045
 │   ├─{OoklaServer},5046
 │   ├─{OoklaServer},5047
 │   ├─{OoklaServer},5048
 │   ├─{OoklaServer},5049
 │   ├─{OoklaServer},5050
 │   ├─{OoklaServer},5051
 │   ├─{OoklaServer},5052
 │   ├─{OoklaServer},5053
 │   └─{OoklaServer},5054
 ├─{OoklaServer},1392
 └─{OoklaServer},10088
- 
				man signal
 
 Signal     Valeur    Action   Commentaire
 ─────────────────────────────────────────────────────────────────────────
 SIGHUP        1       Term    Déconnexion détectée sur le terminal
 de contrôle ou mort du processus de
 contrôle.
 SIGINT        2       Term    Interruption depuis le clavier.
 SIGQUIT       3       Core    Demande « Quitter » depuis le clavier.
 SIGILL        4       Core    Instruction illégale.
 SIGABRT       6       Core    Signal d'arrêt depuis abort(3).
 SIGFPE        8       Core    Erreur mathématique virgule flottante.
 SIGKILL       9       Term    Signal « KILL ».
 SIGSEGV      11       Core    Référence mémoire invalide.
 SIGPIPE      13       Term    Écriture dans un tube sans
 lecteur.
 SIGALRM      14       Term    Temporisation alarm(2) écoulée.
 SIGTERM      15       Term    Signal de fin.
 SIGUSR1   30,10,16    Term    Signal utilisateur 1.
 SIGUSR2   31,12,17    Term    Signal utilisateur 2.
 
 SIGCHLD   20,17,18    Ign     Fils arrêté ou terminé.
 SIGCONT   19,18,25    Cont    Continuer si arrêté.
 SIGSTOP   17,19,23    Stop    Arrêt du processus.
 SIGTSTP   18,20,24    Stop    Stop invoqué depuis le terminal.
 SIGTTIN   21,21,26    Stop    Lecture sur le terminal en arrière-plan.
 SIGTTOU   22,22,27    Stop    Écriture dans le terminal en arrière-plan.
 
 
 
 C'est quoi kill -0 ?
 A moins que cela ai changé, si tu tues le ppid le fork pid reviens à init, si tu tues le père à la main, il faut tuer tous les fils.
- 
				C'est quoi kill -0 ?
 
 
 ca permet de tester l'existence d'un process. c'est utiliser dans le script fourni après le kill pour attendre l'arret des process. (voir man kill).
 
 kill -0 1388 ne kill rien du tout, c'est inefficace pour ce process.
 
 J'ai tenté plusieurs fois, mais il est toujours là avec ses petits.
 
 
 mais effectivement je me suis trompé c'est "kill 1388" qu'il fallait faire , sans le -0.
- 
				Même en rajoutant ExitType=cgroup, on est obligé d'attendre l’expiration du timeout.
 
 J'utilise la configuration proposée ci-dessous :
 il manque juste "ExitType=cgroup" dans le fichier .service:
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=simple
 ExecStart=/home/speedtest/bin/OoklaServer
 ExitType=cgroup
 Restart=always
 RestartSec=15
 User=speedtest
 TimeoutStopSec=90s
 [Install]
 WantedBy=multi-user.target
 
 La raison de ce blocage est que la fin du process père ne tue pas le fils.
 
 Ce matin le père est le process 693 :
 # pstree -ap 693
 OoklaServer,693
 ├─OoklaServer,755 --ward --server-id=3ddadcab-9c30-4ab4-9057-9c1080b27817
 │   ├─{OoklaServer},756
 │   ├─{OoklaServer},757
 │   ├─{OoklaServer},758
 │   ├─{OoklaServer},759
 │   ├─{OoklaServer},760
 │   ├─{OoklaServer},761
 │   ├─{OoklaServer},762
 │   ├─{OoklaServer},763
 │   ├─{OoklaServer},764
 │   ├─{OoklaServer},765
 │   ├─{OoklaServer},766
 │   ├─{OoklaServer},767
 │   ├─{OoklaServer},768
 │   ├─{OoklaServer},769
 │   ├─{OoklaServer},770
 │   ├─{OoklaServer},771
 │   ├─{OoklaServer},772
 │   ├─{OoklaServer},773
 │   ├─{OoklaServer},774
 │   ├─{OoklaServer},775
 │   ├─{OoklaServer},776
 │   ├─{OoklaServer},777
 │   ├─{OoklaServer},778
 │   ├─{OoklaServer},779
 │   ├─{OoklaServer},780
 │   ├─{OoklaServer},781
 │   ├─{OoklaServer},782
 │   ├─{OoklaServer},784
 │   ├─{OoklaServer},785
 │   ├─{OoklaServer},786
 │   ├─{OoklaServer},787
 │   ├─{OoklaServer},788
 │   ├─{OoklaServer},789
 │   ├─{OoklaServer},790
 │   ├─{OoklaServer},791
 │   ├─{OoklaServer},792
 │   ├─{OoklaServer},793
 │   ├─{OoklaServer},794
 │   ├─{OoklaServer},795
 │   ├─{OoklaServer},796
 │   ├─{OoklaServer},797
 │   └─{OoklaServer},1043
 ├─{OoklaServer},719
 ├─{OoklaServer},720
 ├─{OoklaServer},722
 ├─{OoklaServer},723
 ├─{OoklaServer},724
 └─{OoklaServer},754
 
 Je tu le process père :
 # kill 693
 
 System.d a bien relancé le serveur sur PID 1061 qui a crée un fil 1062, mais le fils du 693, le PID 755 est toujours là :
 # ps faux | grep Ookla
 root        1073  0.0  0.0   8996   672 pts/0    S+   08:07   0:00                      \_ grep --color=auto Ookla
 speedte+     755  0.2  0.1 2136416 13100 ?       Sl   08:04   0:00 /home/speedtest/bin/OoklaServer --ward --server-id=3ddadcab-9c30-4ab4-9057-9c1080b27817
 speedte+    1061  5.0  0.0      0     0 ?        Z    08:07   0:00  \_ [OoklaServer] <defunct>
 speedte+    1062  4.0  0.0  55484  6712 ?        Sl   08:07   0:00  \_ /home/speedtest/bin/OoklaServer --server-id=3ddadcab-9c30-4ab4-9057-9c1080b27817
 
 Ce qui bloque le redémarrage, c'est donc le PID fils et non le père qui est bien tué.
- 
				Ce qui bloque le redémarrage, c'est donc le PID fils et non le père qui est bien tué.
 
 Si tu tues le ppid, les pid reviennent à init et c'est init ( pid 1) qui devient leur ppid
 Essaye un killall sur le pid, de mémoire cela tue tous les fils aussi.
- 
				Si je fais un killall sur le nom, un seul est tué :
 
 $ ps faux | grep Ookla
 speedte+     692  0.0  0.0 194752  6680 ?        Ssl  10:56   0:00 /home/speedtest/bin/OoklaServer
 speedte+     751  2.3  0.1 2382192 12456 ?       Sl   10:56   0:00  \_ /home/speedtest/bin/OoklaServer --ward --server-id=fc1b18ee-723f-459c-b4f2-63868f6910ea
 
 $ sudo killall OoklaServer
 Cela a tué le père :
 $ ps faux | grep Ookla
 speedte+     751  1.2  0.1 2144508 12992 ?       Sl   10:56   0:00 /home/speedtest/bin/OoklaServer --ward --server-id=fc1b18ee-723f-459c-b4f2-63868f6910ea
 
 Étonnant, le fils a crée un fils :
 $ ps faux | grep Ookla
 speedte+     751  1.0  0.1 2136312 13064 ?       Sl   10:56   0:00 /home/speedtest/bin/OoklaServer --ward --server-id=fc1b18ee-723f-459c-b4f2-63868f6910ea
 speedte+    1058  0.5  0.0  55484  6848 ?        Sl   10:57   0:00  \_ /home/speedtest/bin/OoklaServer --server-id=fc1b18ee-723f-459c-b4f2-63868f6910ea
 
 
 J'ai essayé de lancer plusieurs fois de suite sudo killall OoklaServer, mais il est plus rapide que moi a créer des fils.
- 
				Et si tu commençais par le mettre ailleurs que dans /home ? Je sais pas sur /usr/local/sbin par exemple pour faire propre ? ( cela règle pas le problème ) mais ça pique les yeux de le voir là.
 Pour killall il y a des options :)
- 
				Je dois avouer mettre tout ce que j'installe sur home : Cela a aussi un aspect pratique : quand je me connecte sur un serveur, faire un ls sur /home permet de voir tout ce qu'il héberge.
 
 Je crée un utilisateur pour chaque binaire et je mets l’exécutable dans le dossier bin de l'utilisateur, vu que c'est uniquement lui qui le lance et y accède.
 /usr/local/sbin, c'est pour des utilitaires qui demandent les droits root, cela ne semble pas trop adapté.
 Un dossier /usr/local/bin/speedtest/ propriétaire de l'utilisateur speedtest avec un dossier /home/speedtest qui existe mais qui est vide te semble plus pertinent ?
 
 Et pour des sites web (donc pas de binaire, juste du contenu pour Apache) tu le mettrais où ? perso je mets aussi mes sites web dans /home par exemple /home/lafibre.info
 L'avantage est également de dissocier l'espace disque : mes serveurs on un / d'une taille de 25 à 30 Go et le reste de l'espace disque est pour /home
 En mettant le contenu des sites sur /home je suis sur de ne pas saturer la partition racine en cas de problème.
- 
				Je crée un utilisateur pour chaque binaire et je mets l’exécutable dans le dossier bin de l'utilisateur, vu que c'est uniquement lui qui le lance et y accède.
 /usr/local/sbin, c'est pour des utilitaires qui demandent les droits root, cela ne semble pas trop adapté.
 Un dossier /usr/local/bin/speedtest/ propriétaire de l'utilisateur speedtest avec un dossier /home/speedtest qui existe mais qui est vide te semble plus pertinent ?
 
 Tout dépends de comment tu crées "speedtest" c'est un id, dans /etc/passwd ou /etc/shadow et un gid dans /etc/group, il n' a pas nécessairement besoin d'avoir un répertoire dans /home
 oui /usr/local/bin/speedtest/ me semble plus pertinent
 
 Et pour des sites web (donc pas de binaire, juste du contenu pour Apache) tu le mettrais où ? perso je mets aussi mes sites web dans /home par exemple /home/lafibre.info
 
 Il se trouve que tu es mono-utilisateur, mais l'esprit n'est pas celui-là, UNIX est multiutilisateur, et chaque utilisateur a son espace propre pour y héberger ses propres données, un site web par utilisateur, dans son propre espace /home, là cela me choque pas.
 
 L'avantage est également de dissocier l'espace disque : mes serveurs on un / d'une taille de 25 à 30 Go et le reste de l'espace disque est pour /home
 En mettant le contenu des sites sur /home je suis sur de ne pas saturer la partition racine en cas de problème.
 
 Ce qui pose problème quand tu fais un update/upgrade système dans des partitions trop petites, l'espace utilisateur, est l'espace utlisateur, l'espace système est l'espace système ( c'est une lapalissade, mais elle dissocie bien les deux), là c'est un amalgame utilisateur/système.
- 
				il faut quand même un /home pour l'utilisateur que je crée (surtout que je lance bash avec cet utilisateur pour faire l'installation)
 
 Voici les commandes que je passe pour créer l'utilisateur et installer le serveur speedtest :
 
 adduser speedtest --disabled-login --gecos speedtest
 su - speedtest -s /bin/bash
 mkdir /home/speedtest/bin
 cd /home/speedtest/bin/
 wget http://install.speedtest.net/ooklaserver/ooklaserver.sh
 chmod a+x ooklaserver.sh
 ./ooklaserver.sh install
- 
				Ce qui veux dire que le Daemon est lancé avec un sticky bit ? 
 (edit)
 Là ou je veux en venir c'est est-ce que c'est dans le même group pour tuer le processus pour ensuite démonter ?
- 
				Le lancement (et l’arrêt) est fait par systemd, c'est justement l'objet de ce sujet :
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=simple
 ExecStart=/home/speedtest/bin/OoklaServer
 ExitType=cgroup
 Restart=always
 RestartSec=15
 User=speedtest
 TimeoutStopSec=90s
 
 [Install]
 WantedBy=multi-user.target
 
 Il a besoin des droits en écriture, car il le binaire se met à jour automatiquement (ne me demande pas comment cela se passe, je ne sais pas, mais les mises à jour fonctionnent bien), l'ancien binaire est renommé "OoklaServer.previous" comme tu peut le voir dans le ls ci-dessous : La dernière mise à jour date du 10 juillet 2020 et celle d'avant du 18 septembre 2019 :
 
 $ ls -l /home/speedtest/bin/
 total 35212
 -rwxr-x--- 1 speedtest speedtest 18044475 juil. 10  2020 OoklaServer
 -rw-r----- 1 speedtest speedtest        6 mars  23  2020 OoklaServer.pid
 -rwxr-xr-x 1 speedtest speedtest 17986320 sept. 18  2019 OoklaServer.previous
 -rw-r--r-- 1 speedtest speedtest     2276 mars  23  2020 OoklaServer.properties
 -rw-r--r-- 1 speedtest speedtest     3907 juil. 10  2020 OoklaServer.properties.default
 -rwxrwxr-x 1 speedtest speedtest     6708 août  15  2018 ooklaserver.sh
- 
				Tu as plusieurs options.
 
 Soit c'est grave pour le fonctionnement et tu n'es certainement pas le seul, tu te rapproches des équipes de dev pour ouvrir un bug.
 Soit c'est pas si grave et tu as déjà la solution de descendre le timeout à 0 ( vu la vidéo après le timeout les unmount passent).
 Ou poursuivre dans la compréhension de pourquoi le processus est bloqué, cela peut prendre pas mal de temps, c'est chronophage pour un résultat dépendant de ton objectif.
- 
				leur script a un timeout de 20s et pas de 90s donc met 20s et t'embete pas plus.
 
 Apres pour reproduire l'équivalent du script ooklaserver.sh, (notamment stop_process & stop_if_running()) il faut ajouter:
 (a ajouter dans la section [Service]: )
 KillMode = mixed
 TimeoutStopSec = 20s
 
 En plus ton restart est a 15s donc le mettre plutôt a 30s par exemple.
 
 ou si tu veux tu carrément utiliser leur script:
 
 (ajouter dans la section [Service]):
 ExecStop=/home/speedtest/bin/ooklaserver.sh stopet supprimer le TimeoutStopSec.
 
 C'est le plus 'sur' car s'il mette a jour le code du script ooklaserver.sh,  ca sera a jour aussi.
 
 Dans ce cas autant faire aussi leur "start" aussi. Mais leur "start" est de type forking donc faut tout changer et reprendre de zéro:
 
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=forking
 WorkingDirectory=/home/speedtest/bin/
 ExecStart=/home/speedtest/bin/ooklaserver.sh start
 ExecStop=/home/speedtest/bin/ooklaserver.sh stop
 PIDFile=/home/speedtest/bin/OoklaServer.pid
 Restart=always
 RestartSec=30
 User=speedtest
 
 [Install]
 WantedBy=multi-user.target
 
 
 
- 
				Je vais remonter le problème à Ookla, avec le script qu'ils proposent, c'est aussi très long :
 
 https://lafibre.info/videos/linux/202106_ookla_systemd_speedtest.service_script.mp4
 
 Par contre kgersen, KillMode=mixed fait des miracles, le serveur se coupe instantanément, je ne vois même pas passer la ligne tellement c'est rapide :
 Avec KillMode=mixed, le signal SIGTERM est envoyé au processus principal tandis que le signal SIGKILL est envoyé à tous les processus restants du groupe de contrôle de l'unité.
 
 J'ai par contre mis ExitType=main (la valeur par défaut) car il me semble incohérent de mettre KillMode=mixed avec ExitType=cgroup.
 Le fait que KillMode=mixed fonctionne bien montre bien le rôle du processus principal et qu'ils ne sont pas tous au même niveau.
 
 Voici le /etc/systemd/system/speedtest.service qui fonctionne parfaitement :
 [Unit]
 Description=service speedtest Ookla
 After=network-online.target
 Wants=network-online.target
 
 [Service]
 Type=simple
 ExecStart=/home/speedtest/bin/OoklaServer
 ExitType=main
 Restart=always
 RestartSec=30
 User=speedtest
 KillMode=mixed
 TimeoutStopSec=25s
 
 [Install]
 WantedBy=multi-user.target
 
 J'ai baissé le timeout TimeoutStopSec=25s à 25 secondes, vu la vitesse a laquelle cela se passe en temps normal, si on dépasse quelques secondes, cela ne va pas se terminer et autant réduire les 90 secondes à 25 secondes.
 
 Merci pour votre aide !
- 
				Je vois dans mes logs que j'ai :
 /etc/systemd/system/speedtest.service:9: Unknown key name 'ExitType' in section 'Service', ignoring.
 
 ExitType=main n'est pas placé au bon endroit dans mon fichier ?
 (c'est le fichier du message précédent que j'utilise)
 
 -- Logs begin at Mon 2021-10-04 14:26:51 CEST, end at Sun 2021-11-14 22:10:07 CET. --
 nov. 10 06:23:20 appliwave systemd[1]: Started service speedtest Ookla.
 nov. 10 06:23:20 appliwave OoklaServer[1187]: Loaded config file: /home/speedtest/bin/OoklaServer.properties
 nov. 10 06:23:20 appliwave OoklaServer[2136]: Loaded config file: /home/speedtest/bin/OoklaServer.properties
 nov. 10 06:23:27 appliwave systemd[1]: /etc/systemd/system/speedtest.service:9: Unknown key name 'ExitType' in section 'Service', ignoring.
- 
				il sort d'ou ton ExitType ?!
 
 la doc est bon moyen de savoir ce qui existe ou pas : https://www.freedesktop.org/software/systemd/man/systemd.service.html
- 
				On en parlais par exemple là :
 tu peux éventuellement ajouté "ExitType=cgroup" si le programme crée plusieurs process. 
- 
				effectivement ! apres vérification c'est un ajout "récent" pas dispo partout encore ( https://github.com/systemd/systemd/pull/18782 )
			
- 
				Je vois que le serveur Ookla ne va pas chercher les mises à jour des certificats Let's Encrypt, donc si le système reste plusieurs mois sans être redémarré, le certificat est invalide, car il utiise une copie en mémoire vive de l'ancien certificat.
 
 Rajouter un redémarrage du serveur toutes les semaines (604800 secondes) me semble une solution pour contourner ce problème, non ?
 
 Il suffit que je rajouter ça dans la section [servicve] ?
 
 RuntimeMaxSec=604800
- 
				Je vois que le serveur Ookla ne va pas chercher les mises à jour des certificats Let's Encrypt, donc si le système reste plusieurs mois sans être redémarré, le certificat est invalide, car il utiise une copie en mémoire vive de l'ancien certificat.
 
 Rajouter un redémarrage du serveur toutes les semaines (604800 secondes) me semble une solution pour contourner ce problème, non ?
 
 Il suffit que je rajouter ça dans la section [servicve] ?
 
 RuntimeMaxSec=604800
 
 
 oui ca devrait le faire.
- 
				pour ExitType, c'était prévu avec la version 249 de systemd.
 
 pour voir ta version:
 systemctl --version
 mais a priori ca n'a pas passé la Q&A et ca été retiré a la 249-rc3
 
 la 249 final, sortie en juillet 2021 n'a donc pas cette fonctionnalité.
 
 on peut donc oublier ce truc pour le moment.
- 
				Merci !
 
 Quand je lit ça, c'est que j'avais à l'époque trouvé de la documentation :
 J'ai par contre mis ExitType=main (la valeur par défaut) car il me semble incohérent de mettre KillMode=mixed avec ExitType=cgroup.