X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=run.go;h=93c837d9fb458dca6c4bffbe62c120da60aa387f;hb=66de71f560cd772e7ef9e9cf1182ce67e495b1ec;hp=bb455e845df4b20abc91be0a10c584367b43a301;hpb=e14100898b08c312919f58f712f19f623f602748;p=goredo.git diff --git a/run.go b/run.go index bb455e8..93c837d 100644 --- a/run.go +++ b/run.go @@ -63,9 +63,9 @@ var ( StderrPrefix string Jobs sync.WaitGroup - flagTrace = flag.Bool("x", false, "trace current target (sh -x) (set REDO_TRACE=1 for others too)") - flagStderrKeep = flag.Bool("logs", false, "keep job's stderr (REDO_LOGS=1)") - flagStderrSilent = flag.Bool("silent", false, "do not print job's stderr (REDO_SILENT=1)") + flagTrace = flag.Bool("x", false, fmt.Sprintf("trace current target (sh -x) (set %s=1 for others too)", EnvTrace)) + flagStderrKeep = flag.Bool("logs", false, fmt.Sprintf("keep job's stderr (%s=1)", EnvStderrKeep)) + flagStderrSilent = flag.Bool("silent", false, fmt.Sprintf("do not print job's stderr (%s=1)", EnvStderrSilent)) ) type RunErr struct { @@ -193,14 +193,20 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { fdLock.Close() return TgtErr{tgtOrig, err} } - trace(CDebug, "waiting: %s", tgtOrig) Jobs.Add(1) + trace(CDebug, "waiting: %s", tgtOrig) + if FdStatus != nil { + FdStatus.Write([]byte{StatusWait}) + } go func() { defer Jobs.Done() trace(CLock, "LOCK_EX: %s", fdLock.Name()) unix.Flock(int(fdLock.Fd()), unix.LOCK_EX) lockRelease() trace(CDebug, "waiting done: %s", tgtOrig) + if FdStatus != nil { + FdStatus.Write([]byte{StatusWaited}) + } var depInfo *DepInfo fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix)) if err != nil { @@ -354,10 +360,19 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { "%s=%s", EnvStderrPrefix, childStderrPrefix, )) - cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) fdNum := 0 + cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum)) fdNum++ + + if FdStatus == nil { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvStatusFd)) + } else { + cmd.ExtraFiles = append(cmd.ExtraFiles, FdStatus) + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvStatusFd, 3+fdNum)) + fdNum++ + } + if JSR == nil { // infinite jobs cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJSFd)) @@ -394,6 +409,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { Jobs.Add(1) go func() { jsAcquire(shCtx) + if FdStatus != nil { + FdStatus.Write([]byte{StatusRun}) + } defer func() { jsRelease(shCtx) lockRelease() @@ -406,6 +424,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { os.Remove(fdStdout.Name()) os.Remove(tmpPath) os.Remove(fdLock.Name()) + if FdStatus != nil { + FdStatus.Write([]byte{StatusDone}) + } Jobs.Done() }() started := time.Now() @@ -433,7 +454,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } if fdStderr != nil { tai64nNow(ts) + LogMutex.Lock() fmt.Fprintf(fdStderr, "@%s %s\n", hex.EncodeToString(ts[:]), line) + LogMutex.Unlock() } if StderrSilent { continue