def start(self): with self.cv: if self.state in (JobState.STARTING, JobState.RUNNING): return if not self.requires <= self.context.provides: return self.logger.info('Starting job') pid = os.fork() if pid == 0: os.kill(os.getpid(), signal.SIGSTOP) if not self.stdout_fd and not self.stderr_fd: self.stdout_fd = self.stderr_fd = os.open('/var/tmp/{0}.{1}.log'.format( self.label, os.getpid()), os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600 ) os.dup2(os.open('/dev/null', os.O_RDONLY), sys.stdin.fileno()) os.dup2(self.stdout_fd, sys.stdout.fileno()) os.dup2(self.stderr_fd, sys.stderr.fileno()) if self.user: user = pwd.getpwnam(self.user) os.setuid(user.pw_uid) if self.user: group = grp.getgrnam(self.group) os.setgid(group.gr_gid) if not self.program_arguments: self.program_arguments = [self.program] bsd.closefrom(3) os.setsid() env = BASE_ENV.copy() env.update(self.environment) try: os.execvpe(self.program, self.program_arguments, env) except: os._exit(254) self.logger.debug('Started as PID {0}'.format(pid)) self.pid = pid self.context.track_pid(self.pid) self.set_state(JobState.STARTING) os.waitpid(self.pid, os.WUNTRACED) os.kill(self.pid, signal.SIGCONT)
def close_fds(low_fd, max_fd=None): if max_fd is None: closefrom(low_fd) else: common_close_fds(low_fd, max_fd)
def preexec_fn(): bsd.closefrom(3)