Tengo un script de inicio /etc/init.d/myservicepara 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é pidofdevuelve solo el PID correcto del servicio que quiero detener y pgrepdevuelve el PID del servicio y el PID del script de inicio? ¿Puedo confiar en que pidofsiempre se ignorará el PID del script de inicio?
fuente

pidofno regresa10001, porque el programa sísh, ¿no?Creo que no debe confiar
pidof, puede hacer que su programa falle. Un ejemplo simple con elsupervisordprograma:Como puede ver, el
supervisordintérprete de python lo llama realmente, hacepidofque falle:fuente
killproc. ¿Por qué no usa esto mientras lo ha usadodaemonen lastartfunción?killprocpara matar el proceso en sí.parent process,child processtambién morirá su voluntad.El
pidofcomando ignora los scripts a menos que incluya la-xopció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