"time"
"go.cypherpunks.ru/recfile"
- "go.cypherpunks.ru/tai64n"
+ "go.cypherpunks.ru/tai64n/v2"
"golang.org/x/sys/unix"
)
flagTraceAll = flag.Bool("xx", false, fmt.Sprintf("trace (sh -x) all targets (%s=1)", 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))
+
+ TracedAll bool
)
type RunErr struct {
if e.Finished == nil {
return name
}
- return fmt.Sprintf("%s (%fsec)", name, e.Finished.Sub(*e.Started).Seconds())
+ return fmt.Sprintf("%s (%.3fs)", name, e.Finished.Sub(*e.Started).Seconds())
}
func (e RunErr) Error() string {
args = make([]string, 0, 3)
} else {
cmdName = "/bin/sh"
- if traced {
+ if traced || TracedAll {
args = append(args, "-ex")
} else {
args = append(args, "-e")
))
fdNum := 0
+ cmd.ExtraFiles = append(cmd.ExtraFiles, FdOODTgts)
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvOODTgtsFd, 3+fdNum))
+ fdNum++
+ cmd.ExtraFiles = append(cmd.ExtraFiles, FdOODTgtsLock)
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvOODTgtsLockFd, 3+fdNum))
+ fdNum++
+
if FdStatus == nil {
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvStatusFd))
} else {
fdNum++
}
- if JSR == nil {
- // infinite jobs
- cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJSFd))
- } else {
- cmd.ExtraFiles = append(cmd.ExtraFiles, JSR)
- cmd.ExtraFiles = append(cmd.ExtraFiles, JSW)
- cmd.Env = append(cmd.Env, fmt.Sprintf(
- "%s=%d,%d", EnvJSFd, 3+fdNum+0, 3+fdNum+1,
- ))
- fdNum += 2
- }
-
// Preparing stderr
var fdStderr *os.File
if StderrKeep {
Jobs.Add(1)
go func() {
- jsAcquire(shCtx)
+ jsToken := jsAcquire(shCtx)
+ if JSR == nil {
+ // infinite jobs
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJobs))
+ } else {
+ cmd.ExtraFiles = append(cmd.ExtraFiles, JSR)
+ cmd.ExtraFiles = append(cmd.ExtraFiles, JSW)
+ cmd.Env = append(cmd.Env, fmt.Sprintf(
+ "%s=%s %s%d,%d",
+ MakeFlagsName, MakeFlags, MakeJSArg, 3+fdNum+0, 3+fdNum+1,
+ ))
+ fdNum += 2
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvJSToken, jsToken))
+ }
+
if FdStatus != nil {
FdStatus.Write([]byte{StatusRun})
}
fdNum++
defer func() {
- jsRelease(shCtx)
+ jsRelease(shCtx, jsToken)
lockRelease()
fdDep.Close()
fdStdout.Close()
continue
}
if fdStderr != nil {
- tai64n.FromTime(time.Now(), ts)
+ ts.FromTime(time.Now())
LogMutex.Lock()
- fmt.Fprintf(fdStderr, "%s %s\n", ts.Encode(), line)
+ fmt.Fprintln(fdStderr, tai64n.Encode(ts[:]), line)
LogMutex.Unlock()
}
if StderrSilent {