in nodemanager/core/Process.cpp [360:442]
void Process::Monitor()
{
assert(this->processId > 0);
Logger::Debug(this->jobId, this->taskId, this->requeueCount, "Monitor the forked process {0}", this->processId);
pthread_create(&this->outputThreadId, nullptr, Process::ReadPipeThread, this);
int status;
rusage usage;
assert(this->processId > 0);
pid_t waitedPid = wait4(this->processId, &status, 0, &usage);
assert(this->processId > 0);
if (waitedPid == -1)
{
Logger::Error(this->jobId, this->taskId, this->requeueCount, "wait4 for process {0} error {1}", this->processId, errno);
this->message << "wait4 for process " << this->processId << " error " << errno << std::endl;
this->SetExitCode(errno);
return;
}
assert(this->processId > 0);
if (waitedPid != this->processId)
{
Logger::Error(this->jobId, this->taskId, this->requeueCount,
"Process {0}: waited {1}, errno {2}", this->processId, waitedPid, errno);
assert(false);
return;
}
if (WIFEXITED(status))
{
Logger::Info(this->jobId, this->taskId, this->requeueCount,
"Process {0}: exit code {1}", this->processId, WEXITSTATUS(status));
this->SetExitCode(WEXITSTATUS(status));
if (!this->streamOutput)
{
std::string output;
int ret = 0;
if (this->dumpStdout)
{
ret = System::ExecuteCommandOut(output, "head -c 1500", this->stdOutFile);
if (ret == 0)
{
this->message << "STDOUT: " << output << std::endl;
}
}
if (this->stdOutFile != this->stdErrFile)
{
ret = System::ExecuteCommandOut(output, "head -c 1500", this->stdErrFile);
if (ret == 0)
{
this->message << "STDERR: " << output << std::endl;
}
}
}
}
else
{
if (WIFSIGNALED(status))
{
Logger::Info(this->jobId, this->taskId, this->requeueCount, "Process {0}: WIFSIGNALED Signal {1}", this->processId, WTERMSIG(status));
this->message << "Process " << this->processId << ": WIFSIGNALED Signal " << WTERMSIG(status) << std::endl;
}
if (WCOREDUMP(status))
{
Logger::Info(this->jobId, this->taskId, this->requeueCount, "Process {0}: Core dumped.", this->processId);
this->message << "Process " << this->processId << ": Core dumped." << std::endl;
}
Logger::Error(this->jobId, this->taskId, this->requeueCount, "Process {0}: wait4 status {1}", this->processId, status);
this->SetExitCode(status);
this->message << "Process " << this->processId << ": wait4 status " << status << std::endl;
}
Logger::Debug(this->jobId, this->taskId, this->requeueCount, "Process {0}: Monitor ended", this->processId);
}