2016-05-30 6 views
0

J'ai un script python en arrière-plan avec nohup ./myprogram.py 1>console.out &. Le programme est constamment connecté à un fichier journal et le traitement est long. Après avoir exécuté pendant 2 jours (samedi et dimanche), je voisla raison de la sortie de mon programme

# myprogram and myprogram2 are both running in background 
# myprogram2 clearly has finished 
[1] + 25159 exit 1  nohup ./myprogram.py 1>console.out & 
[2] + 25442 done  nohup ./myprogram2.py 1>console2.out & 

Le journal myprogram

2016-05-27 16:55:06 - sources.edf - INFO - processing day 1 ... 
2016-05-27 16:55:06 - sources.edf - INFO - processing day 2 ... 
... 
2016-05-27 16:55:06 - sources.edf - INFO - processing day n ... 

et arrêté (il devrait y avoir n + 1 et plus). Malheureusement, j'ai juste écrasé sur console.out déjà (donc dump à écraser dessus avant même que je regarde ... mais je continuais à partir du jour n et semble que le programme peut être exécuté sans aucune erreur/exception)

Je sais que cette description est un peu ou simplement trop vague pour indiquer une raison quelconque pour cette sortie. J'ai juste besoin de savoir quelque chose à ce sujet. Je ne suis pas complètement nouveau à ce sujet mais je manque d'expérience. Donc, toute estimation possible est appréciée.

Le code source simplifiée:

import os 
import sys 
import logging 
import logging.config as lconfig 
from optparse import OptionParser 
from contextlib import closing 
from datetime import datetime, timedelta 
from collections import defaultdict 

import psycopg2 
from configobj import ConfigObj 

if __name__ == "__main__": 
    ## setup optparser and parse argvs and return opts and args 
    conf = ConfigObj(opts.config, list_values=False)[args[0]] 
    __import__(conf["module"]) 
    ## myprogram and myprogram2 is running the same source code 
    ## same module. only the data is different 
    ## source will provide Mapper and iterator as APIs 
    source = sys.modules[conf["module"]] 
    ## extract start and end date, configure log 

    # set up regions info and mapper 
    ## connect to db and read countries and exchange list 
    with closing(psycopg2.connect(conf["dsn"])) as db: 
     cursor = db.cursor() 
     regions = source.setup_region(conf['Regions'], cursor) 
     ## find all wanted exchanges: (exch, region) 
     exchanges = source.setup_exchanges(conf['Exchanges'], cursor) 
     mapper = source.Mapper(exchanges, cursor, conf) 

    iterator = source.iterator(conf, start, end) 

    logger = logging.getLogger() 
    logger.info('START') 
    with regions: 
     for filename, raw_rec in iterator: 
      logger.info('Processing file {0}'.format(filename) 
      try: 
       record = source.Record(filename, raw_rec) 
      except Exception as e: 
       logger.warn("record parsing error: %s" % e) 
       continue 
      stks = mapper.find(record) 
      if not stks: 
       continue 
      regs = defaultdict(set) 
      for stk in stks: 
       regnm = exchanges[stk[2]] 
       regs[regnm].add(stk) 
      for reg,secs in regs.iteritems(): 
       info = regions[reg] 
       outf = info.get_file(record.get_tm()) 
       source.output(outf, record, secs, info.tz, conf) 

    logger.info('END') 

Le journal juste arrêté comme Prccessing certains fichiers ...

+1

Pouvez-vous poster myprogram.py et myprogram2.py? – SilentMonk

+0

@SilentMonk, c'est juste un gros trop long pour poster ici. Je vais essayer de simplifier –

+0

Log * stderr * ('2>') aussi et nous le saurons. – pacholik

Répondre

0

connexion de base de données peut tomber à tout moment et votre code ne traite pas de cette question. Les ordinateurs doivent également redémarrer de temps en temps, comme les coupures de courant, les mises à jour de sécurité.

Il est évident qu'il ya d'autres raisons pour lesquelles votre code pourrait se rompre et c'est la raison pour laquelle vous avez besoin de le faire fonctionner en tant que service dans le cas où vous souhaitez le rendre fiable.

Apprenez à exécuter ce script python en tant que service systemd et configurez ce service pour qu'il redémarre automatiquement en cas d'échec. Cela l'empêcherait de s'arrêter même s'il y a un bug qui le bloque. Systemd va le redémarrer s'il tombe en panne.

Il y a beaucoup de ressources documentant cela, mais vous pouvez commencer avec https://learn.adafruit.com/running-programs-automatically-on-your-tiny-computer/systemd-writing-and-enabling-a-service