Ich versuche, ein Python-basiertes Programm zu steuern (das sich nicht von der Konsole löst).
#!/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
Der Startteil funktioniert einwandfrei. Ich kann sehen, dass das Skript läuft, aber der Stoppteil nicht. Es heißt einfachNo xx found running; none killed.
Ich nehme also an, dass mit dem Startteil etwas nicht stimmt?
Antwort1
start-stop-daemon --start --pidfile "$pid"
schreibt nicht in die PID-Datei, es sei denn, --make-pidfile
( -m
) ist angegeben. Ohne --make-pidfile
diese Option muss das gestartete Programm die Datei erstellen. Damit dies --make-pidfile
funktioniert, darf sich der gestartete Prozess auch nicht selbst als Daemon ausführen (über einen Fork), da er dann start-stop-daemon
nicht weiß, welche PID er in die Datei schreiben soll.
Das Einzige, --pidfile "$pid"
was in Ihrem Nutzungsszenario passiert, ist, dass start-stop-daemon
das Programm nicht gestartet wird, wenn es bereits ausgeführt wird.
Wenn der Prozess immer noch nicht anhält, müssen alle an übergebenen Kriterien start-stop-daemon --stop
übereinstimmen. Das bedeutet, $pid
dass es sich um einen laufenden Prozess handeln muss, die UID des Prozesses muss übereinstimmen $user
und der Prozessname (arg0) muss übereinstimmen $name
.
Sie können den Wert von arg0 ermitteln, indem Sie Folgendes tun:ps h -p $pid -o comm