Source File: go-coreutils/nohup/main.go

package main

import (
  "os"
  "os/exec"
  "github.com/mattn/go-isatty"
  "flag"
  "log"
  "io"
  "os/signal"
  "syscall"
)

func Exec(prog string, args []string, target_out io.Writer) {
    cmd := exec.Command(prog, args...)
    if cmd.Err != nil { log.Fatal(cmd.Err) }

    in, err := cmd.StdinPipe()
    if err != nil { log.Fatal(err) }
    in.Close()

    stdout, err := cmd.StdoutPipe()
    if err != nil { log.Fatal(err) }

    stderr, err := cmd.StderrPipe()
    if err != nil { log.Fatal(err) }

    output := io.MultiReader(stdout, stderr)

    err = cmd.Start()
    if err != nil { log.Fatal(err) }

    _, err = io.Copy(target_out, output)
    if err != nil { log.Fatal(err) }
}

func OpenOutput() io.Writer {
  fd := os.Stdout.Fd()
  is_atty := isatty.IsTerminal(fd) || isatty.IsCygwinTerminal(fd)

  if is_atty {
    // create nohup
    out_file, err := os.OpenFile("nohup.out", os.O_RDWR | os.O_CREATE | os.O_TRUNC, 0644)
    if err != nil { log.Fatal(err) }
    return out_file
  } else {
    return os.Stdout
  }
}

func main() {
  flag.Parse()
  args := flag.Args()

  if flag.NArg() == 0 {
	  log.Fatal("USAGE: nohup cmd [args]")
  }

  output := OpenOutput()
  Exec(args[0], args[1:], output)

  signal.Ignore(syscall.SIGHUP)
}