X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/81dd4a91b279b3229fb359df6c5dbf07571083ac..4a919918a4ce37b5290793f02fa959db1c073590:/services/crunch-run/crunchrun.go diff --git a/services/crunch-run/crunchrun.go b/services/crunch-run/crunchrun.go index 7d933632c9..3261291b53 100644 --- a/services/crunch-run/crunchrun.go +++ b/services/crunch-run/crunchrun.go @@ -222,7 +222,14 @@ var brokenNodeHook *string = flag.String("broken-node-hook", "", "Script to run func (runner *ContainerRunner) runBrokenNodeHook() { if *brokenNodeHook == "" { - runner.CrunchLog.Printf("No broken node hook provided, cannot mark node as broken.") + path := filepath.Join(lockdir, brokenfile) + runner.CrunchLog.Printf("Writing %s to mark node as broken", path) + f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0700) + if err != nil { + runner.CrunchLog.Printf("Error writing %s: %s", path, err) + return + } + f.Close() } else { runner.CrunchLog.Printf("Running broken node hook %q", *brokenNodeHook) // run killme script @@ -980,7 +987,7 @@ func (runner *ContainerRunner) AttachStreams() (err error) { go func() { _, err := io.Copy(response.Conn, stdinRdr) if err != nil { - runner.CrunchLog.Print("While writing stdin collection to docker container %q", err) + runner.CrunchLog.Printf("While writing stdin collection to docker container: %v", err) runner.stop(nil) } stdinRdr.Close() @@ -990,7 +997,7 @@ func (runner *ContainerRunner) AttachStreams() (err error) { go func() { _, err := io.Copy(response.Conn, bytes.NewReader(stdinJson)) if err != nil { - runner.CrunchLog.Print("While writing stdin json to docker container %q", err) + runner.CrunchLog.Printf("While writing stdin json to docker container: %v", err) runner.stop(nil) } response.CloseWrite() @@ -1736,6 +1743,11 @@ func main() { cgroupParent := flag.String("cgroup-parent", "docker", "name of container's parent cgroup (ignored if -cgroup-parent-subsystem is used)") cgroupParentSubsystem := flag.String("cgroup-parent-subsystem", "", "use current cgroup for given subsystem as parent cgroup for container") caCertsPath := flag.String("ca-certs", "", "Path to TLS root certificates") + detach := flag.Bool("detach", false, "Detach from parent process and run in the background") + stdinEnv := flag.Bool("stdin-env", false, "Load environment variables from JSON message on stdin") + sleep := flag.Duration("sleep", 0, "Delay before starting (testing use only)") + kill := flag.Int("kill", -1, "Send signal to an existing crunch-run process for given UUID") + list := flag.Bool("list", false, "List UUIDs of existing crunch-run processes") enableNetwork := flag.String("container-enable-networking", "default", `Specify if networking should be enabled for container. One of 'default', 'always': default: only enable networking if container requests it. @@ -1747,8 +1759,37 @@ func main() { memprofile := flag.String("memprofile", "", "write memory profile to `file` after running container") getVersion := flag.Bool("version", false, "Print version information and exit.") flag.Duration("check-containerd", 0, "Ignored. Exists for compatibility with older versions.") + + ignoreDetachFlag := false + if len(os.Args) > 1 && os.Args[1] == "-no-detach" { + // This process was invoked by a parent process, which + // has passed along its own arguments, including + // -detach, after the leading -no-detach flag. Strip + // the leading -no-detach flag (it's not recognized by + // flag.Parse()) and ignore the -detach flag that + // comes later. + os.Args = append([]string{os.Args[0]}, os.Args[2:]...) + ignoreDetachFlag = true + } + flag.Parse() + if *stdinEnv && !ignoreDetachFlag { + // Load env vars on stdin if asked (but not in a + // detached child process, in which case stdin is + // /dev/null). + loadEnv(os.Stdin) + } + + switch { + case *detach && !ignoreDetachFlag: + os.Exit(Detach(flag.Arg(0), os.Args, os.Stdout, os.Stderr)) + case *kill >= 0: + os.Exit(KillProcess(flag.Arg(0), syscall.Signal(*kill), os.Stdout, os.Stderr)) + case *list: + os.Exit(ListProcesses(os.Stdout, os.Stderr)) + } + // Print version information if requested if *getVersion { fmt.Printf("crunch-run %s\n", version) @@ -1756,6 +1797,7 @@ func main() { } log.Printf("crunch-run %s started", version) + time.Sleep(*sleep) containerId := flag.Arg(0) @@ -1829,3 +1871,21 @@ func main() { log.Fatalf("%s: %v", containerId, runerr) } } + +func loadEnv(rdr io.Reader) { + buf, err := ioutil.ReadAll(rdr) + if err != nil { + log.Fatalf("read stdin: %s", err) + } + var env map[string]string + err = json.Unmarshal(buf, &env) + if err != nil { + log.Fatalf("decode stdin: %s", err) + } + for k, v := range env { + err = os.Setenv(k, v) + if err != nil { + log.Fatalf("setenv(%q): %s", k, err) + } + } +}