- squeueUpdater.SlurmLock.Lock()
- defer squeueUpdater.SlurmLock.Unlock()
-
- log.Printf("sbatch starting: %+q", cmd.Args)
- err := cmd.Start()
- if err != nil {
- submitErr = fmt.Errorf("Error starting sbatch: %v", err)
- return
- }
-
- stdoutChan := make(chan []byte)
- go func() {
- b, _ := ioutil.ReadAll(stdoutReader)
- stdoutReader.Close()
- stdoutChan <- b
- }()
-
- stderrChan := make(chan []byte)
- go func() {
- b, _ := ioutil.ReadAll(stderrReader)
- stderrReader.Close()
- stderrChan <- b
- }()
-
- // Send a tiny script on stdin to execute the crunch-run command
- // slurm actually enforces that this must be a #! script
- io.WriteString(stdinWriter, execScript(append(crunchRunCommand, container.UUID)))
- stdinWriter.Close()
-
- err = cmd.Wait()
-
- stdoutMsg := <-stdoutChan
- stderrmsg := <-stderrChan
-
- close(stdoutChan)
- close(stderrChan)
-
- if err != nil {
- submitErr = fmt.Errorf("Container submission failed: %v: %v (stderr: %q)", cmd.Args, err, stderrmsg)
- return
+ sqCheck.L.Lock()
+ defer sqCheck.L.Unlock()
+
+ log.Printf("exec sbatch %+q", cmd.Args)
+ err := cmd.Run()
+ switch err.(type) {
+ case nil:
+ log.Printf("sbatch succeeded: %q", strings.TrimSpace(stdout.String()))
+ return nil
+ case *exec.ExitError:
+ return fmt.Errorf("sbatch %+q failed: %v (stderr: %q)", cmd.Args, err, stderr.Bytes())
+ default:
+ return fmt.Errorf("exec failed: %v", err)