2009-03-21 11 views
14

Tengo un daemon que he escrito usando Python. Cuando se está ejecutando, tiene un archivo PID ubicado en /tmp/filename.pid. Si el daemon no se está ejecutando, entonces el archivo PID no existe.¿Cómo puedo verificar que exista un archivo y ejecutar un comando si no?

En Linux, ¿cómo puedo verificar que el archivo PID exista y, de no ser así, ejecutar un comando para reiniciarlo?

El comando sería

python daemon.py restart 

que tiene que ser ejecutado desde un directorio específico.

+1

La parte "que tiene que ejecutarse desde un directorio específico" parece una receta de problemas. Cuidado: reconsidere si es posible. –

+0

duplicado: http://stackoverflow.com/questions/638975/how-do-i-tell-if-a-file-does-not-exist-in-bash/ – hop

+0

/tmp es una mala ubicación para poner archivos PID , ya que algunas distribuciones tienen procesos más limpios que eliminan archivos de/tmp, y los usuarios pueden eliminar archivos de allí para hacer espacio. –

Respuesta

35
[ -f /tmp/filename.pid ] || python daemon.py restart 

-f comprueba si existe la ruta dada y es un archivo normal (sólo -e comprueba si existe la ruta de acceso)

la [] realizar la prueba y vuelve 0 en caso de éxito, 1 lo contrario

la || es un C-like or, por lo que si falla el comando de la izquierda, ejecute el comando a la derecha.

Así que la declaración final dice, si /tmp/filename.pid NO existe, entonces inicie el daemon.

7

Si se trata de secuencias de comandos bash se está preguntando acerca, algo como esto funcionaría:

if [ ! -f "$FILENAME" ]; then 
    python daemon.py restart 
fi 

Una mejor opción puede ser la de mirar en lockfile

6

Las otras respuestas están muy bien para detectar la existencia de el archivo. Sin embargo, para una solución completa, probablemente debería comprobar que el PID en el archivo pid todavía se está ejecutando, y que es su programa.

1

Otro enfoque para resolver el problema es un script que se asegura de que su demonio "permanece" vivo ...

Algo como esto (nota: el manejo de señales, debe añadirse para el buen arranque/apagado):

$PIDFILE = "/path/to/pidfile" 

if [ ! -f "$PIDFILE" ]; then 
    echo "Pid file exists!" 
    exit 1 
fi 

while true; do 
    # Write it's own pid file 
    python your-server.py ; 

    # force removal of pid in case of unexpected death. 
    rm -f $PIDFILE; 

    # sleep for 2 seconds 
    sleep 2; 

done 

De esta forma, el servidor se mantendrá con vida aunque falle inesperadamente.

1
ls /tmp/filename.pid 

Devuelve verdadero si el archivo existe. Devuelve falso si el archivo no existe.

3
test -f filename && daemon.py restart || echo "File doesn't exists" 
Cuestiones relacionadas