Procházet zdrojové kódy

celerybeat: Added --detach option

Ask Solem před 14 roky
rodič
revize
eebe29f112
4 změnil soubory, kde provedl 56 přidání a 28 odebrání
  1. 6 1
      celery/apps/beat.py
  2. 23 0
      celery/bin/base.py
  3. 25 7
      celery/bin/celerybeat.py
  4. 2 20
      celery/bin/celeryd_detach.py

+ 6 - 1
celery/apps/beat.py

@@ -1,3 +1,4 @@
+import atexit
 import socket
 import sys
 import traceback
@@ -27,7 +28,7 @@ class Beat(object):
     def __init__(self, loglevel=None, logfile=None, schedule=None,
             max_interval=None, scheduler_cls=None, app=None,
             socket_timeout=30, redirect_stdouts=None,
-            redirect_stdouts_level=None, **kwargs):
+            redirect_stdouts_level=None, pidfile=None, **kwargs):
         """Starts the celerybeat task scheduler."""
         self.app = app = app_or_default(app)
 
@@ -42,6 +43,7 @@ class Beat(object):
                                  app.conf.CELERY_REDIRECT_STDOUTS)
         self.redirect_stdouts_level = (redirect_stdouts_level or
                                        app.conf.CELERY_REDIRECT_STDOUTS_LEVEL)
+        self.pidfile = pidfile
 
         if not isinstance(self.loglevel, int):
             self.loglevel = LOG_LEVELS[self.loglevel.upper()]
@@ -65,6 +67,9 @@ class Beat(object):
 
     def start_scheduler(self, logger=None):
         c = self.colored
+        if self.pidfile:
+            pidlock = platforms.create_pidlock(self.pidfile).acquire()
+            atexit.register(pidlock.release)
         beat = self.Service(app=self.app,
                             logger=logger,
                             max_interval=self.max_interval,

+ 23 - 0
celery/bin/base.py

@@ -111,3 +111,26 @@ class Command(object):
 
     def _get_default_app(self, *args, **kwargs):
         return celery.Celery(*args, **kwargs)
+
+
+def daemon_options(default_pidfile, default_logfile=None):
+    return (
+        Option('-f', '--logfile', default=default_logfile,
+               action="store", dest="logfile",
+               help="Path to the logfile"),
+        Option('--pidfile', default=default_pidfile,
+               action="store", dest="pidfile",
+               help="Path to the pidfile."),
+        Option('--uid', default=None,
+               action="store", dest="uid",
+               help="Effective user id to run as when detached."),
+        Option('--gid', default=None,
+               action="store", dest="gid",
+               help="Effective group id to run as when detached."),
+        Option('--umask', default=0,
+               action="store", type="int", dest="umask",
+               help="Umask of the process when detached."),
+        Option('--workdir', default=None,
+               action="store", dest="working_directory",
+               help="Directory to change to when detached."),
+)

+ 25 - 7
celery/bin/celerybeat.py

@@ -22,19 +22,39 @@
     `ERROR`, `CRITICAL`, or `FATAL`.
 
 """
-from celery.bin.base import Command, Option
+from celery.bin.base import Command, Option, daemon_options
+from celery.platforms import create_daemon_context
 
 
 class BeatCommand(Command):
 
-    def run(self, *args, **kwargs):
+    def run(self, detach=False, logfile=None, pidfile=None, uid=None,
+            gid=None, umask=None, working_directory=None, **kwargs):
         kwargs.pop("app", None)
-        return self.app.Beat(**kwargs).run()
+
+        if not detach:
+            return self.app.Beat(logfile=logfile, **kwargs).run()
+
+        context, on_stop = create_daemon_context(
+                                logfile=logfile,
+                                pidfile=pidfile,
+                                uid=uid,
+                                gid=gid,
+                                umask=umask,
+                                working_directory=working_directory)
+        context.open()
+        try:
+            self.app.Beat(pidfile=pidfile, logfile=logfile, **kwargs).run()
+        finally:
+            on_stop()
 
     def get_options(self):
         conf = self.app.conf
 
         return (
+            Option('--detach',
+                default=False, action="store_true", dest="detach",
+                help="Detach and run in the background."),
             Option('-s', '--schedule',
                 default=conf.CELERYBEAT_SCHEDULE_FILENAME,
                 action="store", dest="schedule",
@@ -49,14 +69,12 @@ class BeatCommand(Command):
                 action="store", dest="scheduler_cls",
                 help="Scheduler class. Default is "
                      "celery.beat.PersistentScheduler"),
-            Option('-f', '--logfile', default=conf.CELERYBEAT_LOG_FILE,
-                action="store", dest="logfile",
-                help="Path to log file."),
             Option('-l', '--loglevel',
                 default=conf.CELERYBEAT_LOG_LEVEL,
                 action="store", dest="loglevel",
                 help="Loglevel. One of DEBUG/INFO/WARNING/ERROR/CRITICAL."),
-        )
+        ) + daemon_options(default_pidfile="celerybeat.pid",
+                           default_logfile=conf.CELERYBEAT_LOG_FILE)
 
 
 def main():

+ 2 - 20
celery/bin/celeryd_detach.py

@@ -4,28 +4,10 @@ import sys
 from optparse import OptionParser, BadOptionError, make_option as Option
 
 from celery import __version__
+from celery.bin.base import daemon_options
 from celery.platforms import create_daemon_context
 
-OPTION_LIST = (
-        Option('-f', '--logfile', default=None,
-               action="store", dest="logfile",
-               help="Path to the logfile"),
-        Option('--pidfile', default="celeryd.pid",
-               action="store", dest="pidfile",
-               help="Path to the pidfile."),
-        Option('--uid', default=None,
-               action="store", dest="uid",
-               help="Effective user id to run as when detached."),
-        Option('--gid', default=None,
-               action="store", dest="gid",
-               help="Effective group id to run as when detached."),
-        Option('--umask', default=0,
-               action="store", type="int", dest="umask",
-               help="Umask of the process when detached."),
-        Option('--workdir', default=None,
-               action="store", dest="working_directory",
-               help="Directory to change to when detached."),
-)
+OPTION_LIST = daemon_options(default_pidfile="celeryd.pid")
 
 
 class detached(object):