def _execute(self, jobWrapper, stats, localTempDir, jobStore, fileStore):
        if stats != None:
            startTime = time.time()
            startClock = getTotalCpuTime()
        baseDir = os.getcwd()
        #Run the job
        returnValues = self._run(jobWrapper, fileStore)
        #Serialize the new jobs defined by the run method to the jobStore
        self._serialiseExistingJob(jobWrapper, jobStore, returnValues)
        # If the job is not a checkpoint job, add the promise files to delete
        # to the list of jobStoreFileIDs to delete
        if not self.checkpoint:
            for jobStoreFileID in promiseFilesToDelete:
                fileStore.deleteGlobalFile(jobStoreFileID)
        else:
            # Else copy them to the job wrapper to delete later
            jobWrapper.checkpointFilesToDelete = list(promiseFilesToDelete)
        promiseFilesToDelete.clear()
        #Now indicate the asynchronous update of the job can happen
        fileStore._updateJobWhenDone()
        #Change dir back to cwd dir, if changed by job (this is a safety issue)
        if os.getcwd() != baseDir:
            os.chdir(baseDir)
        #Finish up the stats
        if stats != None:
            totalCpuTime, totalMemoryUsage = getTotalCpuTimeAndMemoryUsage()
            stats.jobs.append(
                Expando(
                    time=str(time.time() - startTime),
                    clock=str(totalCpuTime - startClock),
                    class_name=self._jobName(),
                    memory=str(totalMemoryUsage)
                )
            )
Execute the function or another executor in a specific way or in
dataset/ETHPy150Open BD2KGenomics/toil/src/toil/job.py/Job._execute--crossover with--dataset/ETHPy150Open saltstack/salt/salt/executors/__init__.py/ModuleExecutorBase.execute