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) }