2016-05-30 5 views
0

私はnohup ./myprogram.py 1>console.out &でバックグラウンドで実行されているpythonスクリプトを持っています。プログラムは常にいくつかのログファイルにロギングしており、処理は長いです。 2日(土曜日と日曜日)のために実行した後、私は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 ... 

ため

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

ログを参照し、停止した(N + 1とそれ以上が存在する必要があります)。

悲しいことに、私はすでにconsole.outで上書きしてしまっています(見た目になる前に上書きするようにダンプします...)しかし、n日後もプログラムはエラー/例外なしで実行できるようです。

私はこの説明がちょっとあまりにも漠然としていて、この出口の理由を指摘していることを知っています。私はちょうどこれについていくつかの手掛かりを知る必要があります。私はこれに完全に新しいですが、私は経験が不足しています。ですから、可能な限りの推測は認められます。

が簡略化されたソースコード:

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

で始めることができますか? – SilentMonk

+0

@SilentMonk、ここに投稿するには長すぎます。 –

+0

Log * stderr *( '2>')も簡略化しようとしています。 – pacholik

答えて

0

データベース接続は、いつでもドロップすることができ、あなたのコードは、この問題に対処していません。また、コンピュータは、電源切断、セキュリティアップデートなど、時々再起動する必要があります。

明らかに、コードが壊れる可能性がある他の理由があり、信頼できるようにするためにサービスとして実行する必要があるのは明らかです。

このpythonスクリプトをsystemdサービスとして実行し、このサービスが失敗した場合に自動的に再起動するように設定する方法を学びます。これは、クラッシュしたバグがあっても停止しないようにします。クラッシュした場合、Systemdは再起動します。これを文書化資源がたくさんある

しかし、あなたは、あなたがmyprogram.pyを投稿してmyprogram2.pyできますhttps://learn.adafruit.com/running-programs-automatically-on-your-tiny-computer/systemd-writing-and-enabling-a-service

関連する問題