Hello, I am using the web2py scheduler to run a task to monitor a directory. Here's some code describing what I'm doing:
def get_configured_logger(): logger = logging.getLogger("ss_server") if (len(logger.handlers) == 0): handler = logging.handlers.RotatingFileHandler("/path/to/log/log.txt ", maxBytes=1024*1024*10, backupCount=2) handler.setLevel(logging.DEBUG) logger.addHandler(handler) logger.setLevel(logging.DEBUG) logger.debug("Logger created") return logger def write_to_log(s): l = get_configured_logger() l.info(s) ... def searchForFiles(): print("serach for files") write_to_log("searching for files") print os.getcwd() write_to_log("creating watermark") watermark_opaque = Image.open('./path/to/image/watermark.png') watermark = reduce_opacity(watermark_opaque, 0.7) write_to_log("done creating watermark") write_to_log("globbing files") files = glob.glob(INPUT_DIR + "*.jpg") write_to_log("files globbed") for filename in files: write_to_log("getting basename for " + filename) filename = os.path.basename(filename) write_to_log("splitting filename") parts = filename.split('-') write_to_log("checking filename") if (len(parts) == 6): try: print("processing file: " + filename) write_to_log("processing file: " + filename) im = Image.open(INPUT_DIR + filename) write_to_log("adding watermark") im.paste(watermark,(im.size[0] - watermark.size[0] - 20 ,im.size[1] - watermark.size[1] - 20),watermark) im.save(INPUT_DIR + filename, "JPEG", quality=100) write_to_log("added watermark") write_to_log("creating scaled images") createScaledImage(64, INPUT_DIR + filename, THUMBS_DIR) createScaledImage(600, INPUT_DIR + filename, SMALL_DIR) write_to_log("done creating scaled images") pic_id = processFile(filename) print("processed file successfully") write_to_log("processed file successfully") write_to_log("renaming files") shutil.move(INPUT_DIR + filename, PROCESSED_DIR + "%d" % pic_id + ".jpg") shutil.move(THUMBS_DIR + filename, THUMBS_DIR + "%d" % pic_id + ".jpg") shutil.move(SMALL_DIR + filename, SMALL_DIR + "%d" % pic_id + ".jpg") write_to_log("done renaming files") except IOError: #this is likely due to a partial file, so let it finish writing and try #again next time print("IO Error") write_to_log("IO Error") pass except: etype, eval, etb = sys.exc_info() print("error processing file: ", eval.message) write_to_log("error: " + eval.message) shutil.move(INPUT_DIR + filename, ERRORS_DIR + filename) write_to_log("end of loop") write_to_log("ending function") return "success" myscheduler = Scheduler(db, tasks=dict(searchForFiles=searchForFiles)) I have a task inserted into my scheduler_task table with the following properties: function name: searchForFiles repeats: 0 timeout: 240 sync output: 15 Everything works fine except I get random TIMEOUT runs 1-2 times per day. Furthermore these runs will happen in the middle of the night when nothing has been added to the directory. When a TIMEOUT happens, the last line in my log file is "ending function". Also, there is no output at all in the scheduler_run record for the run that was marked as TIMEOUT. For these reasons I do not think the timeout is happening inside my code, I believe it is somehow happening between when the scheduler tries to pick up task and when it calls my function. I could totally be wrong though. The reason I have added in such granular logging is to find exactly where the timeout was occurring so I could fix it but I cannot find the problem anywhere. Please let me know if anyone has any ideas on what could be causing this issue. Any help would be very much appreciated. If I cannot fix it I will have to find a different solution for directory monitoring and not use the scheduler. Thanks again, Mike --