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