@@ -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
1514func 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