def run(server_only=False):
    # set up logging:
    logging.basicConfig(
        filename=LOG_FILE_NAME,
        format='%(asctime)s - %(levelname)s:%(message)s',
        level=logging.DEBUG
    )

    try:
        import setproctitle
        setproctitle.setproctitle('anagramatron')
    except ImportError:
        print("missing module: setproctitle")
        pass

    if server_only:
        hit_server.start_hit_server()
    else:

        hitserver = multiprocessing.Process(target=hit_server.start_hit_server)
        hitserver.daemon = True
        hitserver.start()

        anagram_finder = AnagramFinder()
        stats.clear_stats()

        while 1:
            print('top of run loop')
            logging.debug('top of run loop')
            try:
                print('starting stream handler')
                stream_handler = StreamHandler()
                stream_handler.start()
                for processed_tweet in stream_handler:
                    anagram_finder.handle_input(processed_tweet)
                    stats.update_console()

            except NeedsMaintenance:
                logging.debug('caught NeedsMaintenance exception')
                print('performing maintenance')
                stream_handler.close()
                anagram_finder.perform_maintenance()

            except KeyboardInterrupt:
                stream_handler.close()
                anagram_finder.close()
                return 0

            except Exception as err:
                logging.error(sys.exc_info())
                stream_handler.close()
                anagram_finder.close()
                TwitterHandler().send_message(str(err) +
                                              "\n" +
                                              datetime.today().isoformat())
                raise