Skip to content

Commit de95ec6

Browse files
committed
feat: improves executor and signal handling
1 parent e8c8878 commit de95ec6

File tree

3 files changed

+25
-12
lines changed

3 files changed

+25
-12
lines changed

main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func main() {
113113
execArgs = cctx.Args().Tail()
114114
}
115115

116-
ex := executor.NewExecutor(ctx, executor.ExecutorArgs{
116+
ex := executor.NewExecutor(executor.ExecutorArgs{
117117
Logger: logger,
118118
Command: func(context.Context) *exec.Cmd {
119119
cmd := exec.Command(execCmd, execArgs...)

pkg/executor/exec.go

+23-10
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import (
1212
)
1313

1414
type Executor struct {
15-
ctx context.Context
16-
done chan os.Signal
17-
logger *slog.Logger
15+
done chan os.Signal
16+
logger *slog.Logger
17+
isRunning bool
1818

1919
newCmd func(context.Context) *exec.Cmd
2020
mu sync.Mutex
@@ -25,7 +25,7 @@ type ExecutorArgs struct {
2525
Command func(context.Context) *exec.Cmd
2626
}
2727

28-
func NewExecutor(ctx context.Context, args ExecutorArgs) *Executor {
28+
func NewExecutor(args ExecutorArgs) *Executor {
2929
done := make(chan os.Signal, 1)
3030
signal.Notify(done, syscall.SIGTERM)
3131

@@ -36,19 +36,24 @@ func NewExecutor(ctx context.Context, args ExecutorArgs) *Executor {
3636
return &Executor{
3737
done: done,
3838
logger: args.Logger,
39-
ctx: ctx,
4039
newCmd: args.Command,
4140
mu: sync.Mutex{},
4241
}
4342
}
4443

4544
func (ex *Executor) Exec() error {
45+
ex.logger.Debug("[exec:pre] starting process")
4646
ex.mu.Lock()
47-
defer ex.mu.Unlock()
47+
ex.isRunning = true
48+
49+
defer func() {
50+
ex.isRunning = false
51+
ex.mu.Unlock()
52+
}()
4853

4954
ex.logger.Debug("[exec] starting process")
5055

51-
ctx, cf := context.WithCancel(ex.ctx)
56+
ctx, cf := context.WithCancel(context.TODO())
5257
defer cf()
5358

5459
cmd := ex.newCmd(ctx)
@@ -65,22 +70,30 @@ func (ex *Executor) Exec() error {
6570
case <-ex.done:
6671
ex.logger.Debug("executor terminated", "pid", cmd.Process.Pid)
6772
}
73+
for len(ex.done) > 0 {
74+
<-ex.done
75+
}
76+
6877
ex.logger.Debug("[exec] killing process", "pid", cmd.Process.Pid)
6978
if err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL); err != nil {
70-
ex.logger.Error("failed to kill process", "pid", cmd.Process.Pid, "err", err)
79+
if err.Error() != "no such process" {
80+
ex.logger.Error("failed to kill process", "pid", cmd.Process.Pid, "err", err)
81+
}
7182
}
7283
}()
7384

7485
if err := cmd.Wait(); err != nil {
7586
if strings.HasPrefix(err.Error(), "signal:") {
7687
ex.logger.Debug("wait terminated, received", "signal", err.Error())
7788
}
78-
return err
89+
ex.logger.Debug("while waiting, got", "err", err)
7990
}
8091

8192
return nil
8293
}
8394

8495
func (ex *Executor) Kill() {
85-
ex.done <- os.Signal(syscall.SIGTERM)
96+
if ex.isRunning {
97+
ex.done <- os.Signal(syscall.SIGTERM)
98+
}
8699
}

pkg/watcher/watcher.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func (f *fsnWatcher) WatchEvents(watcherFunc func(event Event, fp string) error)
9292
eInfo.Counter += 1
9393
f.eventMap[event.Name] = eInfo
9494

95-
if time.Since(eInfo.Time) < 1*time.Second {
95+
if time.Since(eInfo.Time) < 100*time.Millisecond {
9696
f.Logger.Debug("too many events under 1s, ignoring...", "counter", eInfo.Counter)
9797
continue
9898
}

0 commit comments

Comments
 (0)