44 "fmt"
55 "net/http"
66 "os"
7- "os/exec"
87 "os/signal"
98 "syscall"
109 "time"
@@ -28,6 +27,7 @@ func init() {
2827 pflag .Duration ("scrape-interval" , time .Second , "fpm metrics scrape interval" )
2928
3029 pflag .Uint ("line-buffer-size" , 16 * 1024 , "Max log line size (in bytes)" )
30+ pflag .Duration ("shutdown-delay" , 500 * time .Millisecond , "Delay before process shutdown" )
3131
3232 pflag .Parse ()
3333
@@ -73,28 +73,28 @@ func main() {
7373 defer dataListener .Stop ()
7474
7575 signalCh := make (chan os.Signal , 1 )
76- signal .Notify (signalCh , os . Interrupt )
77- signal . Notify ( signalCh , os . Kill )
78-
79- cmd := exec . Command ( viper .GetString ("fpm" ))
80- cmd . Stdout = os . Stdout
81- cmd . Stderr = stderr
82- cmd . Env = os . Environ ()
83- cmd . Env = append ( cmd . Env , fmt . Sprintf ( "FPM_WRAPPER_SOCK=unix://%s" , viper .GetString ("wrapper-socket" )))
84- cmd . Args = append ( cmd . Args , "--nodaemonize" )
85- cmd . Args = append ( cmd . Args , "--fpm-config" , viper . GetString ( "fpm-config" ))
86- cmd . Args = append ( cmd . Args , findFpmArgs () ... )
87-
88- if err = cmd .Start (); err != nil {
76+ signal .Notify (signalCh , syscall . SIGINT , syscall . SIGTERM , syscall . SIGQUIT , syscall . SIGUSR1 , syscall . SIGUSR2 )
77+
78+ fpmProcess := phpfpm . NewProcess (
79+ viper .GetString ("fpm" ),
80+ viper . GetString ( "fpm-config" ),
81+ os . Stdout ,
82+ stderr ,
83+ viper .GetString ("wrapper-socket" ),
84+ viper . GetDuration ( "shutdown-delay" ),
85+ findFpmArgs () ...
86+ )
87+
88+ if err = fpmProcess .Start (); err != nil {
8989 fmt .Printf ("exec.Command: %v" , err )
9090 os .Exit (1 )
9191 }
9292
93- go handleSignals (cmd , signalCh )
94- procErrCh := make (chan error , 1 )
93+ go fpmProcess .HandleSignal (signalCh )
9594
95+ fpmExitCodeCh := make (chan int , 1 )
9696 go func () {
97- procErrCh <- cmd .Wait ()
97+ fpmExitCodeCh <- fpmProcess .Wait (errCh )
9898 }()
9999
100100 http .Handle (viper .GetString ("metrics-path" ), promhttp .Handler ())
@@ -112,27 +112,8 @@ func main() {
112112 if err != nil {
113113 panic (err )
114114 }
115- case err := <- procErrCh :
116- if err == nil {
117- os .Exit (0 )
118- }
119- if exitErr , ok := err .(* exec.ExitError ); ok {
120- if status , ok := exitErr .Sys ().(syscall.WaitStatus ); ok {
121- os .Exit (status .ExitStatus ())
122- }
123- } else {
124- panic (err )
125- }
126- }
127- }
128- }
129-
130- func handleSignals (cmd * exec.Cmd , signalCh chan os.Signal ) {
131- for {
132- err := cmd .Process .Signal (<- signalCh )
133- if err != nil {
134- fmt .Printf ("cmd.Process.Signal: %v" , err )
135- os .Exit (1 )
115+ case exitCode := <- fpmExitCodeCh :
116+ os .Exit (exitCode )
136117 }
137118 }
138119}
0 commit comments