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)
def preexec_fn(): os.setpgrp() if oom_adj is not None: set_oom_adj(oom_adj)
def preexec_fn(): if oom_adj is not None: set_oom_adj(oom_adj) _preexec_fn(report_pipe[1])
def preexec_fn(): if task.setpgrp: os.setpgrp() if task.oom_adj is not None: set_oom_adj(task.oom_adj)