Esto puede ser complicado, porque puede tener instancias separadas del mismo proceso que viven independientemente. Por ejemplo, servidores que escuchan en diferentes puertos o servicios que se ejecutan como diferentes usuarios. Para distinguir entre estas instancias, debe asignar a cada una de ellas una etiqueta única. La etiqueta a menudo es un archivo, pero puede ser un socket local en el espacio de nombres abstracto, un puerto TCP, etc., cualquier identificador único servirá. Cuando la etiqueta es un archivo, puede ser un archivo normal que contiene una ID de proceso (un archivo pid) o una tubería o socket con nombre que el archivo está escuchando, etc. Idealmente, la etiqueta es un punto final de comunicación que permite a los clientes conectarse a ese proceso.
Cada uno de estos diferentes tipos de etiquetas da como resultado una forma diferente de verificar si la instancia que está buscando está en funcionamiento. Por ejemplo, con un socket de archivo local, intente conectarse a él e inicie el proceso si no hay ningún proceso escuchando en ese socket. Si la etiqueta es un archivo pid, verifique si hay un proceso con esa ID de proceso, pero tenga en cuenta que es frágil, ya que si el proceso ha muerto, puede haber un proceso no relacionado que haya reutilizado su ID. Tenga en cuenta que si dos clientes intentan alcanzar el proceso en un corto período de tiempo, ambos pueden encontrar que el proceso no existe y ambos intentan iniciarlo; Proteger adecuadamente de esta condición de carrera puede ser complicado.
Es más fácil administrar instancias cuando todas son iniciadas por el mismo proceso de supervisor, y ese proceso de supervisor detecta cuándo mueren las instancias y reacciona en consecuencia. Muchos programas de monitoreo de servicios que pueden hacer esto.
Si el programa no responde en un punto final de comunicación conocido y no es administrado por un programa supervisor, la etiqueta del pobre es un archivo pid: un archivo que contiene la ID del proceso. Cuando comience el proceso, escriba el pid en un archivo con un nombre predeterminado. Cuando necesite que exista el proceso, lea el archivo pid y vea si hay un proceso con ese pid. Cuando elimine el proceso, borre el archivo pid. El problema más importante con un archivo pid no supervisado es que si el proceso muere, su pid puede ser reutilizado por algún proceso no relacionado. Al menos debe verificar el nombre del proceso o el ejecutable del proceso para asegurarse de que está hablando con el proceso correcto. Muchas variantes de Unix tienen un comando pgrep :pgrep SOMENAME
enumera los procesos cuyo nombre contiene SOMENAME como una subcadena, con opciones adicionales para limitar a un usuario en particular, para requerir una coincidencia exacta, para cambiar cuál de las varias nociones posibles de "nombre de proceso" se usa, etc.
ps -ef | grep -v grep | grep "process_name" || run_command_here