lockRelease()
return TgtErr{tgtOrig, err}
}
+ fdDepPath := fdDep.Name()
cleanup := func() {
lockRelease()
fdDep.Close()
cleanup()
return TgtErr{tgtOrig, err}
}
+ fdDep.Close()
trace(CWait, "%s", runErr.Name())
// Prepare command line
cleanup()
return TgtErr{tgtOrig, err}
}
- tmpPath := fdStdout.Name() + ".3" // and for $3
+ stdoutPath := fdStdout.Name()
+ fdStdout.Close()
+ tmpPath := stdoutPath + ".3" // and for $3
tmpPathRel, err := filepath.Rel(cwd, tmpPath)
if err != nil {
panic(err)
cmd := exec.Command(cmdName, args...)
cmd.Dir = cwd
- cmd.Stdout = fdStdout
// cmd.Stdin reads from /dev/null by default
cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%d", EnvLevel, Level+1))
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix))
))
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 {
}
// Preparing stderr
- stderr, err := cmd.StderrPipe()
- if err != nil {
- panic(err)
- }
var fdStderr *os.File
if StderrKeep {
fdStderr, err = os.OpenFile(
if FdStatus != nil {
FdStatus.Write([]byte{StatusRun})
}
+
+ started := time.Now()
+ runErr.Started = &started
+ fdStdout, err = os.OpenFile(stdoutPath, os.O_RDWR, os.FileMode(0666))
+ if err != nil {
+ runErr.Err = err
+ errs <- runErr
+ return
+ }
+ cmd.Stdout = fdStdout
+ fdDep, err = os.OpenFile(fdDepPath, os.O_WRONLY|os.O_APPEND, os.FileMode(0666))
+ if err != nil {
+ runErr.Err = err
+ errs <- runErr
+ return
+ }
+ cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep)
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum))
+ fdNum++
+
defer func() {
jsRelease(shCtx)
lockRelease()
}
Jobs.Done()
}()
- started := time.Now()
- runErr.Started = &started
- err := cmd.Start()
+ stderr, err := cmd.StderrPipe()
+ if err != nil {
+ runErr.Err = err
+ errs <- runErr
+ return
+ }
+ started = time.Now()
+ err = cmd.Start()
if err != nil {
runErr.Err = err
errs <- runErr