+ arv, err := arvadosclient.MakeArvadosClient()
+ if err != nil {
+ logger.Errorf("error making Arvados client: %v", err)
+ return err
+ }
+ arv.Retries = 25
+
+ ctx, cancel := context.WithCancel(context.Background())
+
+ dispatcher := dispatch.Dispatcher{
+ Logger: logger,
+ Arv: arv,
+ RunContainer: (&LocalRun{startFunc, make(chan bool, 8), ctx, cluster}).run,
+ PollPeriod: time.Duration(*pollInterval) * time.Second,
+ }
+
+ err = dispatcher.Run(ctx)
+ if err != nil {
+ return err
+ }
+
+ c := make(chan os.Signal, 1)
+ signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
+ sig := <-c
+ logger.Printf("Received %s, shutting down", sig)
+ signal.Stop(c)
+
+ cancel()
+
+ runningCmdsMutex.Lock()
+ // Finished dispatching; interrupt any crunch jobs that are still running
+ for _, cmd := range runningCmds {
+ cmd.Process.Signal(os.Interrupt)
+ }
+ runningCmdsMutex.Unlock()
+
+ // Wait for all running crunch jobs to complete / terminate
+ waitGroup.Wait()