le démon start-stop ne fonctionne pas comme prévu, aucun fichier pid n'a été écrit

17

J'essaie de contrôler un programme basé sur python (qui ne se détache pas de la console)

#!/bin/bash

user=nobody
pid=/var/run/xx.pid
name=xx
prog=/xx.py

case $1 in
    start)
        /sbin/start-stop-daemon --start -b --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" --chuid nobody -- --daemon
        ;;
    stop)
        /sbin/start-stop-daemon --stop --oknodo --user "$user" --name "$name" --pidfile "$pid" --retry=TERM/5/KILL/1
        ;;
    restart)
        ;;
    *)
        ;;
esac

La partie de départ fonctionne bien. Je peux voir le script opérationnel, mais pas la partie stop. Il dit simplementNo xx found running; none killed.

Donc je suppose qu'il y a quelque chose qui ne va pas avec la partie de départ?

Marguerite
la source

Réponses:

22

start-stop-daemon --start --pidfile "$pid"n'écrit pas dans le fichier pid sauf si --make-pidfile( -m) est spécifié. Sans --make-pidfilecela, c'est au programme lancé de le créer. Aussi pour --make-pidfilefonctionner, le processus en cours de lancement ne peut pas se démonifier (via un fork), comme alorsstart-stop-daemon ne saura pas quel PID il doit mettre dans le fichier.

La seule chose qui se --pidfile "$pid"produit dans votre scénario d'utilisation est que cela entraînera le start-stop-daemonnon démarrage du programme s'il est déjà en cours d'exécution.


Si le processus ne s'arrête toujours pas, tous les critères transmis start-stop-daemon --stopdoivent correspondre. La signification $piddoit être un processus en cours, l'UID du processus doit correspondre $useret le nom du processus (arg0) doit correspondre $name.
Vous pouvez déterminer la valeur de arg0 en faisantps h -p $pid -o comm

Patrick
la source
D'accord, le pidfile est écrit. Mais la partie d'arrêt ne fonctionne toujours pas, même message d'erreur
marguerite
@ warl0ck est le fichier pid correct, et l'UID du processus correspond-il $user?
Patrick
Oui, j'ai vu start-stop-daemon essayé de lire /proc/pid/stat: read(4, "5559 (python) S 1 5558 5558 0 -1"..., 1024) = 326, de sorte que le nom doit être au pythonlieu peut - être?
marguerite
Fait, substitué le nom à pythonet cela a fonctionné ;-P
marguerite
Oui, ça $namedoit aussi correspondre. Vous avez complètement manqué que vous passiez cela. Mettra à jour la réponse.
Patrick