Tengo un script de inicio /etc/init.d/myservice
para inicializar un servicio como este:
...
start() {
...
daemon /usr/sbin/myservice
...
}
stop() {
...
pgrep myservice
pidof myservice
ps -ef | grep myservice
...
}
Y cuando trato de detener el servicio, este es el resultado:
10000 10001
10000
root 10000 1 0 09:52 ? 00:00:02 /usr/sbin/myservice
root 9791 9788 0 10:06 pts/1 00:00:00 /bin/sh /sbin/service myservice stop
root 10001 9791 1 10:06 pts/1 00:00:00 /bin/sh /etc/init.d/myservice stop
root 9805 9796 0 10:06 pts/1 00:00:00 grep myservice
¿Se espera esto? ¿Por qué pidof
devuelve solo el PID correcto del servicio que quiero detener y pgrep
devuelve el PID del servicio y el PID del script de inicio? ¿Puedo confiar en que pidof
siempre se ignorará el PID del script de inicio?
fuente
pidof
no regresa10001
, porque el programa sísh
, ¿no?Creo que no debe confiar
pidof
, puede hacer que su programa falle. Un ejemplo simple con elsupervisord
programa:Como puede ver, el
supervisord
intérprete de python lo llama realmente, hacepidof
que falle:fuente
killproc
. ¿Por qué no usa esto mientras lo ha usadodaemon
en lastart
función?killproc
para matar el proceso en sí.parent process
,child process
también morirá su voluntad.El
pidof
comando ignora los scripts a menos que incluya la-x
opción. Además, es más seguro incluir la ruta completa en el comando pidof, como en:Esto minimiza las posibilidades de igualar algún otro proceso.
fuente