Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "flag"
- "fmt"
- "io"
- "os"
- "os/exec"
- "path/filepath"
- "time"
- )
- func parseArgs() (string, string, []string) {
- logDir := flag.String("logdir", "", "Log output directory (default=stderr)")
- flag.Parse()
- return *logDir, flag.Arg(0), flag.Args()[1:]
- }
- func execution(commandName string, args[] string, stdout, stderr io.Writer) (*os.ProcessState, error){
- cmd := exec.Command(commandName, args...)
- childStdout, _ := cmd.StdoutPipe()
- childStderr, _ := cmd.StderrPipe()
- go io.Copy(stdout, childStdout)
- go io.Copy(stderr, childStderr)
- err := cmd.Run()
- if err != nil {
- return nil, err
- }
- return cmd.ProcessState, nil
- }
- func initOut(logDir, commandName string) (stdout, stderr io.Writer, err error) {
- if logDir == "" {
- stdout = os.Stdout
- stderr = os.Stderr
- } else {
- ts := time.Now().Unix()
- stdoutFileName := fmt.Sprintf("%s-%v-stdout.log", commandName, ts)
- stdoutFile, err := os.Create(filepath.Join(logDir, stdoutFileName))
- if err != nil {
- return nil, nil, nil
- }
- stdout = io.MultiWriter(os.Stdout, stdoutFile)
- stderrFileName := fmt.Sprintf("%s-%v-stderr.log", commandName, ts)
- stderrFile, err := os.Create(filepath.Join(logDir, stderrFileName))
- if err != nil {
- return nil, nil, nil
- }
- stderr = io.MultiWriter(os.Stderr, stderrFile)
- }
- return
- }
- func main() {
- logDir, commnadName, args := parseArgs()
- stdout, stderr, err := initOut(logDir, commnadName)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Can`t create file : %v\n", err)
- os.Exit(1)
- }
- startTime := time.Now();
- ps, err := execution(commnadName, args, stdout, stderr)
- if err != nil {
- fmt.Fprintf(stderr, "Can`t exec command %s", commnadName)
- os.Exit(1)
- }
- exitTime := time.Now();
- fmt.Fprintln(stdout, ps.String())
- fmt.Fprintf(stdout, "wall clock time=%v system time=%v user time=%v\n",
- exitTime.Sub(startTime), ps.SystemTime(), ps.UserTime())
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement