
Estou tentando controlar um programa baseado em python (que não se separa do 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
A parte inicial funciona bem. Posso ver o script em funcionamento, mas a parte stop não. Simplesmente dizNo xx found running; none killed.
Então eu acho que há algo errado com a parte inicial?
Responder1
start-stop-daemon --start --pidfile "$pid"
não grava no arquivo pid, a menos que --make-pidfile
( -m
) seja especificado. Sem --make-pidfile
isso, cabe ao programa que está sendo lançado criá-lo. Também para --make-pidfile
funcionar, o processo que está sendo iniciado não pode se daemonizar (através de um fork), pois start-stop-daemon
não saberá qual PID deve colocar no arquivo.
A única coisa --pidfile "$pid"
que acontece no seu cenário de uso é que isso resultará na start-stop-daemon
não inicialização do programa se ele já estiver em execução.
Se o processo ainda não estiver parando, todos os critérios passados start-stop-daemon --stop
deverão corresponder. O significado $pid
deve ser um processo em execução, o UID do processo deve corresponder $user
e o nome do processo (arg0) deve corresponder $name
.
Você pode determinar o valor de arg0 fazendops h -p $pid -o comm