2016-05-30 8 views
0

У меня есть сценарий python, работающий в фоновом режиме с nohup ./myprogram.py 1>console.out &. Программа постоянно регистрируется в каком-то файле журнала, и обработка длительная. После запуска в течение 2 дней (суббота и воскресенье) я вижуПричина выхода моей программы

# 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 & 

журнал для 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 ... 

и остановились (там должно быть п + 1 и более).

К сожалению, я просто перезаписал на console.out уже (так что дамп, чтобы перезаписать его, прежде чем я даже посмотрел ... но я продолжал с первого дня, и кажется, что программа может быть запущена без каких-либо ошибок/исключений)

Я знаю, что это описание немного или слишком расплывчато, чтобы указать на какие-либо причины этого выхода. Мне просто нужно знать кое-что об этом. Я не совсем новичок в этом, но мне не хватает опыта. Поэтому оценивается любое возможное предположение.

Упрощенный исходный код:

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') 

Бревно просто остановилась, как Prccessing какой-то файл ...

+1

Вы можете разместить myprogram.py и myprogram2.py? – SilentMonk

+0

@SilentMonk, это просто слишком долго, чтобы публиковать здесь. Я попытаюсь упростить –

+0

Журнал * stderr * ('2>') тоже, и мы это узнаем. – pacholik

ответ

0

Подключение к базе данных может упасть в любой момент, и ваш код не справиться с этой проблемой. Кроме того, компьютеры должны периодически перезапускаться, например, отключить питание, обновления для системы безопасности.

Очевидно, что есть другие причины, по которым ваш код может сломаться, и именно поэтому вам нужно заставить его работать как услугу, если вы хотите сделать его надежным.

Узнайте, как запустить этот скрипт python как службу systemd и настроить эту службу для автоматического перезапуска, если она не удалась. Это предотвратило бы его остановку, даже если есть ошибка, которая разбила его. Systemd перезапустит его, если он сработает.

Есть много ресурсов, документально это, но вы можете начать с https://learn.adafruit.com/running-programs-automatically-on-your-tiny-computer/systemd-writing-and-enabling-a-service