Example #1
0
    def _start_process(self, task):
        if task.use_pgrpguard:
            if not self.pgrpguard_binary:
                return None, RuntimeError("No setup for pgrpguard")
            running_task = self.PgrpguardRunningTask(task.task_id, self.pgrpguard_binary)
        else:
            running_task = self.RunningTask(task.task_id)

        try:
            exec_err_rd, exec_err_wr = os.pipe()
        except OSError as e:
            return None, e

        try:
            running_task.on_before_fork()
        except Exception as e:
            return None, e

        with self._lock:
            before_fork_time = time.time()

            try:
                pid = os.fork()
            except OSError as e:
                try:
                    os.close(exec_err_rd)
                    os.close(exec_err_wr)
                except:
                    pass

                try:
                    running_task.on_fork_error()
                except Exception as e:
                    logging_error('on_fork_error failed: %s' % e)

                return None, e

            fork_time = time.time() - before_fork_time

            if pid:
                running_task.pid = pid
                self._active.add(running_task)
                self._running_count += 1

        if pid:
            logging_debug('fork time %s' % fork_time)

            try:
                running_task.on_after_fork()
            except Exception as e:
                logging_error('on_after_fork failed: %s' % e) # FIXME

            os.close(exec_err_wr)

            exec_error = None
            try:
                with os.fdopen(exec_err_rd) as in_:
                    s = in_.read()
                    if s:
                        exec_error = pickle.loads(s)
            except Exception as exec_error:
                try:
                    os.close(exec_err_rd)
                except:
                    pass
            else:
                if exec_error:
                    try:
                        exec_error = running_task.on_exec_error(exec_error)
                    except Exception as e:
                        logging_error('on_exec_error failed: %s' % e)

            running_task.exec_errored = bool(exec_error)
            return pid, exec_error or None

        else: # child
            exit_code = 0
            try:
                _set_cloexec(exec_err_wr)
                os.close(exec_err_rd)

                if task.stdin is not None:
                    dup2file(task.stdin, 0, os.O_RDONLY)
                else:
                    pass # /dev/null

                write_flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC

                if task.stdout is not None:
                    dup2file(task.stdout, 1, write_flags)
                #else:
                    #dup2devnull(2, os.O_WRONLY)

                if task.stderr is not None:
                    dup2file(task.stderr, 2, write_flags)
                #else:
                    #dup2devnull(2, os.O_WRONLY)

                if task.setpgrp:
                    os.setpgrp()

                if task.oom_adj is not None:
                    set_oom_adj(task.oom_adj)

                if task.cwd:
                    os.chdir(task.cwd)

                args = task.args

                if isinstance(args, types.StringTypes):
                    args = [args]
                else:
                    args = list(args)

                if task.shell:
                    args = ["/bin/sh", "-c", ' '.join(args)]
                    #if executable:
                        #args[0] = executable

                #if executable is None:
                    #executable = args[0]

                args = running_task.fix_args(args)
                logging_debug('+ args %s' % args)

                self._modify_signals(False)

                running_task.on_before_exec() # Must run after _modify_signals

                if task.env_update:
                    env = os.environ.copy()
                    env.update(task.env_update)
                    os.execvpe(args[0], args, env)
                else:
                    os.execvp(args[0], args)

            except BaseException as e:
                exit_code = 64
                try:
                    with os.fdopen(exec_err_wr, 'w') as out:
                        serialize(out, e)
                        out.flush()
                except:
                    exit_code = 65
            except:
                exit_code = 66

            os._exit(exit_code)
Example #2
0
 def preexec_fn():
     os.setpgrp()
     if oom_adj is not None:
         set_oom_adj(oom_adj)
Example #3
0
 def preexec_fn():
     if oom_adj is not None:
         set_oom_adj(oom_adj)
     _preexec_fn(report_pipe[1])
Example #4
0
 def preexec_fn():
     if task.setpgrp:
         os.setpgrp()
     if task.oom_adj is not None:
         set_oom_adj(task.oom_adj)