in nodemanager/core/Process.cpp [539:602]
std::string Process::BuildScript()
{
std::string cmd = this->taskFolder + "/cmd.sh";
std::ofstream fsCmd(cmd, std::ios::trunc);
fsCmd << "#!/bin/bash" << std::endl << std::endl;
fsCmd << this->commandLine << std::endl;
fsCmd.close();
std::string runDirInOut = this->taskFolder + "/run_dir_in_out.sh";
std::ofstream fs(runDirInOut, std::ios::trunc);
fs << "#!/bin/bash" << std::endl << std::endl;
Logger::Debug("{0}, {1}", this->taskFolder, this->workDirectory);
std::string workDirectory = this->workDirectory.empty() ? "~" : this->workDirectory;
fs << "cd " << workDirectory << " || exit $?" << std::endl << std::endl;
if (this->stdOutFile.empty()) this->stdOutFile = this->taskFolder + "/stdout.txt";
else if (!boost::algorithm::starts_with(this->stdOutFile, "/") && !StartWithHttpOrHttps(this->stdOutFile)) this->stdOutFile = workDirectory + "/" + this->stdOutFile;
if (this->stdErrFile.empty()) this->stdErrFile = this->taskFolder + "/stderr.txt";
else if (!boost::algorithm::starts_with(this->stdErrFile, "/") && !StartWithHttpOrHttps(this->stdErrFile)) this->stdErrFile = workDirectory + "/" + this->stdErrFile;
// before
fs << "echo before >" << this->taskFolder << "/before1.txt 2>" << this->taskFolder << "/before2.txt";
fs << " || ([ \"$?\" = \"1\" ] && exit 253)" << std::endl;
// test
fs << "echo test >" << this->taskFolder << "/stdout.txt 2>" << this->taskFolder << "/stderr.txt";
fs << " || ([ \"$?\" = \"1\" ] && exit 253)" << std::endl << std::endl;
// run
if (this->streamOutput)
{
fs << "/bin/bash " << cmd << " 2>&1";
}
else if (this->stdOutFile == this->stdErrFile)
{
fs << "/bin/bash " << cmd << " >" << this->stdOutFile << " 2>&1";
}
else
{
fs << "/bin/bash " << cmd << " >" << this->stdOutFile << " 2>" << this->stdErrFile;
}
if (!this->stdInFile.empty())
{
fs << " <" << this->stdInFile;
}
fs << std::endl;
fs << "ec=$?" << std::endl;
fs << "[ $ec -ne 0 ] && exit $ec" << std::endl;
fs << std::endl << std::endl;
// after
fs << "echo after >" << this->taskFolder << "/after1.txt 2>" << this->taskFolder << "/after2.txt";
fs << " || ([ \"$?\" = \"1\" ] && exit 253)" << std::endl;
fs.close();
return std::move(runDirInOut);
}