spawn = require("child_process").spawn logger = require "logger-sharelatex" logger.info "using standard command runner" module.exports = CommandRunner = run: (project_id, command, directory, image, timeout, environment, callback = (error) ->) -> console.log("Command runner", directory) command = (arg.replace('$COMPILE_DIR', directory) for arg in command) console.log("Command runner 2", command) logger.log project_id: project_id, command: command, directory: directory, "running command" logger.warn "timeouts and sandboxing are not enabled with CommandRunner" # merge environment settings env = {} env[key] = value for key, value of process.env env[key] = value for key, value of environment # run command as detached process so it has its own process group (which can be killed if needed) proc = spawn command[0], command.slice(1), stdio: "inherit", cwd: directory, detached: true, env: env proc.on "error", (err)-> logger.err err:err, project_id:project_id, command: command, directory: directory, "error running command" callback(err) proc.on "close", (code, signal) -> logger.info code:code, signal:signal, project_id:project_id, "command exited" if signal is 'SIGTERM' # signal from kill method below err = new Error("terminated") err.terminated = true return callback(err) else if code is 1 # exit status from chktex err = new Error("exited") err.code = code return callback(err) else callback() return proc.pid # return process id to allow job to be killed if necessary kill: (pid, callback = (error) ->) -> try process.kill -pid # kill all processes in group catch err return callback(err) callback()