| 
					
				 | 
			
			
				@@ -63,12 +63,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import os 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CAN_DETACH = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    import resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-except ImportError: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    CAN_DETACH = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from celery.loaders import current_loader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from celery.loaders import settings 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from celery import __version__ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -80,11 +74,10 @@ from celery import conf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from celery import discovery 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from celery.task import discard_all 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from celery.worker import WorkController 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import signal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from celery import platform 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import multiprocessing 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import traceback 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import optparse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import atexit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 USE_STATISTICS = getattr(settings, "CELERY_STATISTICS", False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # Make sure the setting exists. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -144,42 +137,6 @@ OPTION_LIST = ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def acquire_pidlock(pidfile): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    """Get the :class:`daemon.pidlockfile.PIDLockFile` handler for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ``pidfile``. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    If the ``pidfile`` already exists, but the process is not running the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ``pidfile`` will be removed, a ``"stale pidfile"`` message is emitted 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    and execution continues as normally. However, if the process is still 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    running the program will exit complaning that the program is already 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    running in the background somewhere. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    from daemon.pidlockfile import PIDLockFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    import errno 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    pidlock = PIDLockFile(pidfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if not pidlock.is_locked(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return pidlock 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    pid = pidlock.read_pid() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        os.kill(pid, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    except os.error, exc: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if exc.errno == errno.ESRCH: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sys.stderr.write("Stale pidfile exists. Removing it.\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            os.unlink(pidfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return PIDLockFile(pidfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    except TypeError, exc: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        sys.stderr.write("Broken pidfile found. Removing it.\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        os.unlink(pidfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return PIDLockFile(pidfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        raise SystemExit( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "ERROR: Pidfile (%s) already exists.\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "Seems celeryd is already running? (PID: %d)" % ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    pidfile, pid)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return pidlock 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def run_worker(concurrency=DAEMON_CONCURRENCY, detach=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         loglevel=DAEMON_LOG_LEVEL, logfile=DAEMON_LOG_FILE, discard=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         pidfile=DAEMON_PID_FILE, umask=0, uid=None, gid=None, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -187,14 +144,12 @@ def run_worker(concurrency=DAEMON_CONCURRENCY, detach=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         statistics=None, **kwargs): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     """Starts the celery worker server.""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    print("Celery %s is starting." % __version__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # set SIGCLD back to the default SIG_DFL (before python-daemon overrode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # it) lets the parent wait() for the terminated child process and stops 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # the 'OSError: [Errno 10] No child processes' problem. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if hasattr(signal, "SIGCLD"): # Make sure the platform supports signals. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        signal.signal(signal.SIGCLD, signal.SIG_DFL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    print("Celery %s is starting." % __version__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    platform.reset_signal("SIGCLD") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if statistics is not None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         settings.CELERY_STATISTICS = statistics 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -242,31 +197,13 @@ def run_worker(concurrency=DAEMON_CONCURRENCY, detach=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print("Celery has started.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if detach: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if not CAN_DETACH: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            raise RuntimeError( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    "This operating system doesn't support detach. ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        from daemon import DaemonContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         from celery.log import setup_logger, redirect_stdouts_to_logger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # Since without stderr any errors will be silently suppressed, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        # we need to know that we have access to the logfile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if logfile: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            open(logfile, "a").close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        pidlock = acquire_pidlock(pidfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if umask is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            umask = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if uid is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            uid = os.geteuid() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if gid is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            gid = os.getegid() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        working_directory = working_directory or os.getcwd() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        context = DaemonContext(chroot_directory=chroot, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                working_directory=working_directory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                umask=umask, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                pidfile=pidlock, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                uid=uid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                gid=gid) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        context = platform.create_daemon_context(logfile, pidfile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        chroot_directory=chroot, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        working_directory=working_directory, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        umask=umask, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        uid=uid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        gid=gid) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         context.open() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logger = setup_logger(loglevel, logfile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         redirect_stdouts_to_logger(logger, loglevel) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -283,7 +220,7 @@ def run_worker(concurrency=DAEMON_CONCURRENCY, detach=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # Install signal handler that restarts celeryd on SIGHUP, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # (only on POSIX systems) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        install_restart_signal_handler(worker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        install_worker_restart_handler(worker) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             worker.start() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -302,14 +239,9 @@ def run_worker(concurrency=DAEMON_CONCURRENCY, detach=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         raise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def install_restart_signal_handler(worker): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    """Installs a signal handler that restarts the current program 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    when it receives the ``SIGHUP`` signal. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if not hasattr(signal, "SIGHUP"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return  # platform is not POSIX 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def install_worker_restart_handler(worker): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def restart_self(signum, frame): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def restart_worker_sig_handler(signum, frame): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         """Signal handler restarting the current python program.""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         worker.logger.info("Restarting celeryd (%s)" % ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             " ".join(sys.argv))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -322,7 +254,8 @@ def install_restart_signal_handler(worker): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             worker.stop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         os.execv(sys.executable, [sys.executable] + sys.argv) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    signal.signal(signal.SIGHUP, restart_self) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    platform.install_signal_handler("SIGHUP", restart_worker_sig_handler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def parse_options(arguments): 
			 |