void checkFinish (void) { struct jobCard *jobCard, *nextJob; for (jobCard = jobQueHead->forw; (jobCard != jobQueHead); jobCard = nextJob) { nextJob = jobCard->forw; if (!(IS_FINISH(jobCard->jobSpecs.jStatus)) && !(IS_POST_FINISH(jobCard->jobSpecs.jStatus) ) ) { if ( (jobsig(jobCard, 0, FALSE) < 0) || ( (jobCard->jobSpecs.jAttrib & JOB_FORCE_KILL) && (jobCard->jobSpecs.termTime < time(0)-MAX(6,jobTerminateInterval*3)) ) ) { jobGone (jobCard); } } if (jobCard->jobSpecs.actPid) { if (killpg(jobCard->jobSpecs.actPid, SIGCONT) == 0) continue; if (kill(jobCard->jobSpecs.actPid, SIGCONT) == 0) continue; if (jobCard->cleanupPid > 0 && kill(jobCard->cleanupPid, SIGCONT) == 0) continue; sigActEnd(jobCard); continue; } if (IS_FINISH(jobCard->jobSpecs.jStatus) || IS_POST_FINISH(jobCard->jobSpecs.jStatus) || (jobCard->jobSpecs.jStatus & JOB_STAT_PEND)) { job_finish (jobCard, TRUE); } } }
void do_jobSetup(XDR * xdrs, int chfd, struct LSFHeader * reqHdr) { static char fname[] = "do_jobSetup()"; struct jobSetup jsetup; struct jobCard *jp = NULL; char found = FALSE; struct jobCard savejp; if (logclass & LC_EXEC) ls_syslog(LOG_DEBUG, "%s: Entering ...", fname); if (!xdr_jobSetup(xdrs, &jsetup, reqHdr)) { ls_syslog(LOG_ERR, I18N_FUNC_FAIL, fname, "xdr_jobSetup"); return; } for (jp = jobQueHead->forw; (jp != jobQueHead); jp = jp->forw) { if (jp->jobSpecs.jobId != jsetup.jobId) continue; found = TRUE; break; } if (found == FALSE) { ls_syslog(LOG_ERR, _i18n_msg_get(ls_catd , NL_SETN, 5838, "%s: Job <%s> is not found"), /* catgets 5838 */ fname, lsb_jobid2str(jsetup.jobId)); replyHdrWithRC(LSBE_NO_JOB, chfd, jsetup.jobId); return; } if (jp->jobSpecs.actPid) return; memcpy((char *) &savejp, (char *) jp, sizeof(savejp)); jp->execJobFlag |= JOB_EXEC_QPRE_KNOWN; if (jsetup.execJobFlag & JOB_EXEC_QPRE_OK) jp->execJobFlag |= JOB_EXEC_QPRE_OK; jp->jobSpecs.jobPid = jsetup.jobPid; jp->jobSpecs.jobPGid = jsetup.jobPGid; jp->jobSpecs.execUid = jsetup.execUid; strcpy(jp->jobSpecs.execUsername, jsetup.execUsername); jp->execGid = jsetup.execGid; strcpy(jp->execUsername, jsetup.execUsername); strcpy(jp->jobSpecs.execCwd, jsetup.execCwd); strcpy(jp->jobSpecs.execHome, jsetup.execHome); if (jsetup.jStatus & JOB_STAT_RUN) { if (!(jsetup.jStatus & JOB_STAT_PRE_EXEC)) jp->jobSpecs.jStatus &= ~JOB_STAT_PRE_EXEC; if (status_job(BATCH_STATUS_JOB, jp, jp->jobSpecs.jStatus, ERR_NO_ERROR) < 0) { memcpy((char *) jp, (char *) &savejp, sizeof(savejp)); return; } jp->execJobFlag |= JOB_EXEC_STARTED; } else { jp->jobSpecs.reasons = jsetup.reason; jp->collectedChild = TRUE; jp->notReported = 0; jp->exitPid = -1; jp->needReportRU = FALSE; jp->jobSpecs.jStatus = jsetup.jStatus; jp->w_status = jsetup.w_status; jp->lsfRusage = jsetup.lsfRusage; jp->cpuTime = jsetup.cpuTime; if (job_finish(jp, TRUE) < 0) { memcpy((char *) jp, (char *) &savejp, sizeof(savejp)); return; } } if (replyHdrWithRC(LSBE_NO_ERROR, chfd, jsetup.jobId) < 0) { ls_syslog(LOG_DEBUG, "%s: Reply header failed for job <%s>", fname, lsb_jobid2str(jsetup.jobId)); } if (logclass & LC_EXEC) ls_syslog(LOG_DEBUG1, "%s: JobId %s jstatus %d reason %x jobPid %d jobPGid %d execUid %d execGid <%d> execUser <%s> execHome <%s> execCwd <%s> execJobFlag %x cpuTime %f w_status %d", fname, lsb_jobid2str(jsetup.jobId), jsetup.jStatus, jsetup.reason, jsetup.jobPid, jsetup.jobPGid, jsetup.execUid, jsetup.execGid, jsetup.execUsername, jsetup.execHome, jsetup.execCwd, jsetup.execJobFlag, jsetup.cpuTime, jsetup.w_status); }