Skip to content

Commit 427eebb

Browse files
author
changqianqian
committed
refactor(run): 优化信号处理和错误管理机制
- 移除 sync.WaitGroup 依赖,简化并发控制 - 使用 signal.NotifyContext 替代手动信号处理 - 重构错误通道处理逻辑,提高错误传播效率 - 简化程序关闭流程,移除冗余的等待机制 - 优化上下文取消和资源清理逻辑
1 parent d954ae9 commit 427eebb

1 file changed

Lines changed: 22 additions & 35 deletions

File tree

internal/run/run.go

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,64 +5,51 @@ import (
55
"fmt"
66
"os"
77
"os/signal"
8-
"sync"
98
"syscall"
109
"time"
1110

1211
"github.com/bynow2code/rotail/internal/tailer"
1312
)
1413

1514
func Run(cfg *Config) error {
16-
ctx, cancel := context.WithCancel(context.Background())
17-
defer cancel()
15+
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
16+
defer stop()
1817

19-
var wg sync.WaitGroup
18+
done := make(chan struct{})
2019
errors := make(chan error, 1)
2120

22-
wg.Add(1)
2321
go func() {
24-
defer wg.Done()
22+
defer close(done)
2523

24+
var err error
2625
if cfg.File != "" {
27-
if err := tailer.RunFileTailer(ctx, cfg.File); err != nil {
28-
select {
29-
case errors <- err:
30-
default:
31-
}
32-
}
33-
} else if cfg.Dir != "" {
34-
if err := tailer.RunDirTailer(ctx, cfg.Dir, cfg.Extensions); err != nil {
35-
select {
36-
case errors <- err:
37-
default:
38-
}
26+
err = tailer.RunFileTailer(ctx, cfg.File)
27+
} else {
28+
err = tailer.RunDirTailer(ctx, cfg.Dir, cfg.Extensions)
29+
}
30+
31+
if err != nil {
32+
select {
33+
case errors <- err:
34+
default:
3935
}
4036
}
4137
}()
4238

43-
sigChan := make(chan os.Signal, 1)
44-
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
45-
46-
var hadError bool
39+
var runErr error
4740
select {
48-
case <-sigChan:
41+
case <-ctx.Done():
4942
fmt.Println("ℹ️ Received stop signal, shutting down...")
50-
case err := <-errors:
51-
hadError = true
52-
fmt.Fprintf(os.Stderr, "❌ Exiting due to error: %v\n", err)
43+
case runErr = <-errors:
44+
fmt.Fprintf(os.Stderr, "❌ Exiting due to error: %v\n", runErr)
45+
stop()
46+
case <-done:
47+
return nil
5348
}
5449

55-
cancel()
56-
57-
done := make(chan struct{})
58-
go func() {
59-
wg.Wait()
60-
close(done)
61-
}()
62-
6350
select {
6451
case <-done:
65-
if !hadError {
52+
if runErr == nil {
6653
fmt.Println("✅ Graceful shutdown completed.")
6754
}
6855
case <-time.After(5 * time.Second):

0 commit comments

Comments
 (0)