2016-11-01 1 views
1

J'ai un script exécuté par crontab toutes les heures et interagit avec API (base de données de synchronisation). Habituellement, il prenez une heure, et je vérifie pour la prochaine course si ce processus encore dans la mémoire ou non:Comment garantir la suppression du fichier après l'arrêt du script?

#/usr/bin/env python 

import os 
import sys 

pid = str(os.getpid()) 
pidfile = "/tmp/mydaemon.pid" 

if os.path.isfile(pidfile): 
    print "%s already exists, exiting" % pidfile 
    sys.exit() 
file(pidfile, 'w').write(pid) 
try: 
    # Do some actual work here 
finally: 
    os.unlink(pidfile) 

mais après un script de temps a cessé de travailler, quand je regarde le « ps aux | grep python ", je ne vois pas ce script comme le processus, mais je vois le fichier sur l'endroit. Et quand je lance un script manuellement, je vois des informations imprimées de manière itérative sur l'écran, mais après un certain temps, je vois le mot «Terminé», le script est sorti et le fichier est toujours sur le lieu. Comment garantir que le fichier supprimé à 100% après que le script ne fonctionne plus, est garanti 100%?

Merci!

Répondre

0

Normalement, vous pouvez utiliser la fonctionnalité du module atextit, mais dans votre cas (interruption inattendue), elle peut également ne pas fonctionner.

Peut-être utiliser des mkstemp (spécifier le suffixe programme requis/refix) figurant dans la déclaration with peut fonctionner: il va créer pidfile unique en /tmp et l'effacer, lorsque with bloc se termine ou se termine.

0

Il semble que votre script se termine de manière inattendue, probablement en raison d'une utilisation trop importante de la mémoire. Il n'est pas garanti que finally sera exécuté à la fin d'un programme inattendu. Donc, tout d'abord, je vous suggère de trouver la cause de la résiliation inattendue et d'y remédier.

En fait, il n'y a pas de façon 100% de garantir que le fichier sera supprimé. Cependant, il existe quelques solutions de contournement pour la gestion des fichiers PID suspendus.

Placez vos fichiers PID sur le volume /var/run afin qu'ils soient supprimés lors d'un redémarrage inattendu du système.

le processus Vérifier la validité avec une telle pid est toujours en cours d'exécution sur chaque exécution du script:

import os 

def is_alive(pid): 
    try: 
     os.kill(pid, 0) # do nothing but throws an exception 
     return True 
    except OSError: 
     return False 

# and add this to your code: 
if os.path.isfile(pidfile): 
    with open(pidfile) as f: 
     if is_alive(f.read()): 
      sys.exit() 

Encore une fois, à condition de code ne sont pas 100% sûr à cause de collisions pid possibles. Vous pouvez rendre la vérification du processus en cours plus sophistiquée en ajoutant l'analyse de la sortie de la commande ps. Essayez de trouver une ligne avec la valeur pid désirée et vérifiez si elle ressemble à votre entrée crontab.