2010-04-29 15 views
5

He iniciado un daemon de servicio, ejecutando el binario (escrito en C++) a través del archivo de script almacenado rc5.d.Cómo capturar pid de un demonio de Linux ejecutado desde init.d

Pero no estoy seguro de cómo capturar el pid del proceso del daemon y almacenarlo en el archivo pid en /var/run/.pid. Para que pueda usar el pid para la terminación. ¿Cómo puedo hacer esto?

+0

No tan seguro de que esto pertenece en SF. Parece que ha escrito un servicio y desea enviarlo con un guión de inicio adecuado. –

Respuesta

8

Pruebe usar start-stop-daemon(8) con el argumento --pidfile en su script de inicio. Haga que su programa escriba su PID en una ubicación específica (generalmente determinada en un archivo de configuración).

Lo que debe tener en cuenta son los archivos PID obsoletos, por ejemplo, si un archivo de bloqueo persistió durante un reinicio. Esa lógica se implementa mejor en el script de inicio, de ahí la opción --exec a start-stop-daemon.

por ejemplo, si es /var/run/foo.pid1234 y /proc/1234/exe no es su servicio, el archivo de bloqueo es obsoleto y debe ser eliminado en silencio, permitiendo que el servicio se inicie normalmente.

Por lo que respecta a su aplicación, solo asegúrese de que la ubicación del archivo de bloqueo sea configurable, y existen algunos medios para indicarle al script de inicio dónde ubicarlo.

Por ejemplo: (muestra:/etc/default/foo):

PIDFILE=/var/run/foo.pid 
OTHEROPTION=foo 

Luego, en /etc/init.d/fu:

[ -f /etc/default/foo ] && . /etc/default/foo 

vez más, que no sea por escrito a la archivo de forma coherente, toda esta lógica debe manejarse fuera de su aplicación.

+0

@Tim Post, pero esta opción solo verifica si se inicia el daemon o no, si ya se está ejecutando. Quiero que haya alguna forma estándar para escribir el pid en/var/run/ – Poorna

+0

@Sirish: simplemente prueba para ver si el archivo existe, créalo si no, escribe el PID y ciérralo. Si existe, es muy probable que el servidor ya se esté ejecutando. La prueba de archivos de bloqueo obsoletos es mucho más fácil de hacer en el script de inicio. –

+0

@Sirish: actualicé mi respuesta. Creo que es lo que quieres. –

1

Si conoce el puerto que el programa tiene abierto, use el comando fuser para determinar el pid.

1

Se podía ir sobre más de una manera:

  1. En su programa de uso getpid para escribirlo en un archivo configurable (tal vez buscando en ENV)
  2. Uso $! después de comenzar el programa (esto no funciona para mí en archlinux sin embargo: -?)
  3. Después de iniciar el programa, utilice pidof
Cuestiones relacionadas