celerybeat.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/usr/bin/env python
  2. """celerybeat
  3. .. program:: celerybeat
  4. .. cmdoption:: -s, --schedule
  5. Path to the schedule database. Defaults to ``celerybeat-schedule``.
  6. The extension ".db" will be appended to the filename.
  7. .. cmdoption:: -f, --logfile
  8. Path to log file. If no logfile is specified, ``stderr`` is used.
  9. .. cmdoption:: -l, --loglevel
  10. Logging level, choose between ``DEBUG``, ``INFO``, ``WARNING``,
  11. ``ERROR``, ``CRITICAL``, or ``FATAL``.
  12. """
  13. import sys
  14. import optparse
  15. import traceback
  16. import celery
  17. from celery import conf
  18. from celery import platform
  19. from celery.log import emergency_error
  20. from celery.beat import ClockService
  21. from celery.utils import info
  22. STARTUP_INFO_FMT = """
  23. Configuration ->
  24. . broker -> %(conninfo)s
  25. . schedule -> %(schedule)s
  26. . logfile -> %(logfile)s@%(loglevel)s
  27. """.strip()
  28. OPTION_LIST = (
  29. optparse.make_option('-s', '--schedule',
  30. default=conf.CELERYBEAT_SCHEDULE_FILENAME,
  31. action="store", dest="schedule",
  32. help="Path to the schedule database. The extension \
  33. '.db' will be appended to the filename. Default: %s" % (
  34. conf.CELERYBEAT_SCHEDULE_FILENAME)),
  35. optparse.make_option('-f', '--logfile', default=conf.CELERYBEAT_LOG_FILE,
  36. action="store", dest="logfile",
  37. help="Path to log file."),
  38. optparse.make_option('-l', '--loglevel',
  39. default=conf.CELERYBEAT_LOG_LEVEL,
  40. action="store", dest="loglevel",
  41. help="Choose between DEBUG/INFO/WARNING/ERROR/CRITICAL/FATAL."),
  42. )
  43. def run_clockservice(loglevel=conf.CELERYBEAT_LOG_LEVEL,
  44. logfile=conf.CELERYBEAT_LOG_FILE,
  45. schedule=conf.CELERYBEAT_SCHEDULE_FILENAME, **kwargs):
  46. """Starts the celerybeat clock server."""
  47. print("celerybeat %s is starting." % celery.__version__)
  48. # Setup logging
  49. if not isinstance(loglevel, int):
  50. loglevel = conf.LOG_LEVELS[loglevel.upper()]
  51. # Run the worker init handler.
  52. # (Usually imports task modules and such.)
  53. from celery.loaders import current_loader
  54. current_loader().on_worker_init()
  55. # Dump configuration to screen so we have some basic information
  56. # when users sends e-mails.
  57. print(STARTUP_INFO_FMT % {
  58. "conninfo": info.format_broker_info(),
  59. "logfile": logfile or "@stderr",
  60. "loglevel": conf.LOG_LEVELS[loglevel],
  61. "schedule": schedule,
  62. })
  63. print("celerybeat has started.")
  64. arg_start = "manage" in sys.argv[0] and 2 or 1
  65. platform.set_process_title("celerybeat",
  66. info=" ".join(sys.argv[arg_start:]))
  67. def _run_clock():
  68. from celery.log import setup_logger
  69. logger = setup_logger(loglevel, logfile)
  70. clockservice = ClockService(logger=logger, schedule_filename=schedule)
  71. try:
  72. clockservice.start()
  73. except Exception, e:
  74. emergency_error(logfile,
  75. "celerybeat raised exception %s: %s\n%s" % (
  76. e.__class__, e, traceback.format_exc()))
  77. _run_clock()
  78. def parse_options(arguments):
  79. """Parse the available options to ``celeryd``."""
  80. parser = optparse.OptionParser(option_list=OPTION_LIST)
  81. options, values = parser.parse_args(arguments)
  82. return options
  83. def main():
  84. options = parse_options(sys.argv[1:])
  85. run_clockservice(**vars(options))
  86. if __name__ == "__main__":
  87. main()