+ if c[:job] and c[:run_in_process] and not ["Complete", "Failed", "Cancelled"].include? c[:job][:state]
+ report_status
+ begin
+ require 'open3'
+ Open3.popen3("arv-crunch-job", "--force-unlock",
+ "--job", c[:job][:uuid]) do |stdin, stdout, stderr, wait_thr|
+ debuglog "arv-crunch-job pid #{wait_thr.pid} started", 0
+ stdin.close
+ while true
+ rready, wready, = IO.select([stdout, stderr], [])
+ break if !rready[0]
+ begin
+ buf = rready[0].read_nonblock(2**20)
+ rescue EOFError
+ break
+ end
+ (rready[0] == stdout ? $stdout : $stderr).write(buf)
+ end
+ stdout.close
+ stderr.close
+ debuglog "arv-crunch-job pid #{wait_thr.pid} exit #{wait_thr.value.to_i}", 0
+ end
+ if not $arv.job.get(uuid: c[:job][:uuid])[:finished_at]
+ raise Exception.new("arv-crunch-job did not set finished_at.")
+ end
+ rescue Exception => e
+ debuglog "Interrupted (#{e}). Failing job.", 0
+ $arv.job.update(uuid: c[:job][:uuid],
+ job: {
+ state: "Failed"
+ })
+ end
+ end
+