У меня есть сценарий 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 какой-то файл ...
Вы можете разместить myprogram.py и myprogram2.py? – SilentMonk
@SilentMonk, это просто слишком долго, чтобы публиковать здесь. Я попытаюсь упростить –
Журнал * stderr * ('2>') тоже, и мы это узнаем. – pacholik