Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
def close_fds(low_fd, max_fd=None):
    if max_fd is None:
        closefrom(low_fd)
    else:
        common_close_fds(low_fd, max_fd)
Ejemplo n.º 4
0
 def preexec_fn():
     bsd.closefrom(3)
Ejemplo n.º 5
0
 def preexec_fn():
     bsd.closefrom(3)