/** * Executes locally a file * * @param type $workdir the working directory * @param type $script_path the script file, with path relative to the study_dir */ function execute_script_local($workdir, $cmd, $study, $jobid) { include 'config.inc.php'; if (chdir($workdir)) { $outfile = get_absolute_path(get_job_output_file($study, $jobid)); # things that are needed to proc_open, see http://it2.php.net/manual/en/function.proc-open.php $pipes = 0; $descriptors = array(0 => array('pipe', 'r'), 1 => array('file', $outfile, 'a'), 2 => array('file', $outfile, 'a')); $env = array(); $env["HOME"] = get_local_exec_dir(OC_User::getUser()); $env["PATH"] = $_SERVER["PATH"]; # use a UNIX command to get the current user name $env["USER"] = exec("whoami"); chmod($cmd, 0755); $cmd = str_replace(" ", "\\ ", $cmd); $ph = proc_open($cmd . " &", $descriptors, $pipes, $workdir, $env); if ($ph) { /** * @var $status array */ $status = proc_get_status($ph); $pid = $status["pid"]; proc_close($ph); // // UGLY HACK , I increase the PID returned by proc_get_status by 1 // why ? because proc_open() spawns a process /bin/sh, that in turn launches our script. // the full command is /bin/sh -c $command $args // Our process is the direct child of such shell process. // The $pid returned above is the PID of the shell process, not the script launched by that shell. // // Since in Unix the child process is always parent_pid + 1, it's mostly safe to increment that value by 1 // to obtain the real PID // if ($pid) { $pid = (int) $pid + 1; $jobinfo = array("jobid" => $jobid, "pid" => $pid, "start_date" => date("Y-m-d H:i:s"), "script" => $cmd, "exec_dir" => $workdir, "exec_type" => "local"); save_job_info($study, $jobid, $jobinfo); // TODO: here we should check if the job is effectively running with that PID } return $pid; } return false; } else { return false; } }
if (!OC_User::isLoggedIn()) { exit; } $job = $_GET['jobid']; $file = $_GET['study']; $outputid = $_GET['outputid']; $rowid = $_GET['rowid']; # check if we have to print the <tr> elements (we do not print them if this file is called from a AJAX call if (isset($_GET["print_tr"])) { $print_tr = $_GET["print_tr"]; } else { $print_tr = true; // default true } $filelink = OC_Helper::linkTo('files', '', array("dir" => "{$file}/results/{$job}")); $output_file = get_job_output_file($file, $job); $jobinfo = get_job_info($file, $job); // obtain the precedent status $precstatus = isset($jobinfo['status']) ? $jobinfo['status'] : JobStatus::$RUNNING; $qsub_jobname = $jobinfo["qsub_jobname"]; // obtain the current status (potentially slow operation, calls ssh/qstat) $status = get_job_status($jobinfo); $sgequeued = 0; $sgerunning = 0; if ($status == JobStatus::$FINISHED || $status === JobStatus::$KILLED) { if ($precstatus !== $status) { $jobinfo['status'] = $status; // get_job_status returned FINISHED or KILLED, we save that info in the job JSON save_job_info($file, $job, $jobinfo); } if (!isset($jobinfo["usedspace"])) {