diff --git a/worker/base_provider.go b/worker/base_provider.go index 9795fe5..8fdb934 100644 --- a/worker/base_provider.go +++ b/worker/base_provider.go @@ -19,6 +19,7 @@ type baseProvider struct { isMaster bool cmd *cmdJob + logFileFd *os.File isRunning atomic.Value cgroup *cgroupHook @@ -128,10 +129,19 @@ func (p *baseProvider) prepareLogFile(append bool) error { logger.Errorf("Error opening logfile %s: %s", p.LogFile(), err.Error()) return err } + p.logFileFd = logFile p.cmd.SetLogFile(logFile) return nil } +func (p *baseProvider) closeLogFile() (err error) { + if p.logFileFd != nil { + err = p.logFileFd.Close() + p.logFileFd = nil + } + return +} + func (p *baseProvider) Run() error { panic("Not Implemented") } diff --git a/worker/cmd_provider.go b/worker/cmd_provider.go index 92d82ec..da02334 100644 --- a/worker/cmd_provider.go +++ b/worker/cmd_provider.go @@ -88,6 +88,7 @@ func (p *cmdProvider) DataSize() string { func (p *cmdProvider) Run() error { p.dataSize = "" + defer p.closeLogFile() if err := p.Start(); err != nil { return err } diff --git a/worker/rsync_provider.go b/worker/rsync_provider.go index fc17cdf..a1a5a4e 100644 --- a/worker/rsync_provider.go +++ b/worker/rsync_provider.go @@ -105,6 +105,7 @@ func (p *rsyncProvider) DataSize() string { func (p *rsyncProvider) Run() error { p.dataSize = "" + defer p.closeLogFile() if err := p.Start(); err != nil { return err } diff --git a/worker/runner.go b/worker/runner.go index 144f7e1..e20da5b 100644 --- a/worker/runner.go +++ b/worker/runner.go @@ -118,9 +118,6 @@ func (c *cmdJob) Wait() error { return c.retErr default: err := c.cmd.Wait() - if c.cmd.Stdout != nil { - c.cmd.Stdout.(*os.File).Close() - } c.retErr = err close(c.finished) return err diff --git a/worker/two_stage_rsync_provider.go b/worker/two_stage_rsync_provider.go index 576d780..e95da23 100644 --- a/worker/two_stage_rsync_provider.go +++ b/worker/two_stage_rsync_provider.go @@ -156,6 +156,7 @@ func (p *twoStageRsyncProvider) Run() error { if err := p.prepareLogFile(stage > 1); err != nil { return err } + defer p.closeLogFile() if err = p.cmd.Start(); err != nil { return err