Browse code

Windows: no pidfile when service

Signed-off-by: John Howard <jhoward@microsoft.com>

John Howard authored on 2017/03/09 08:18:30
Showing 3 changed files
... ...
@@ -74,7 +74,7 @@ func runDaemon(opts daemonOptions) error {
74 74
 
75 75
 	// On Windows, this may be launching as a service or with an option to
76 76
 	// register the service.
77
-	stop, err := initService(daemonCli)
77
+	stop, runAsService, err := initService(daemonCli)
78 78
 	if err != nil {
79 79
 		logrus.Fatal(err)
80 80
 	}
... ...
@@ -83,6 +83,11 @@ func runDaemon(opts daemonOptions) error {
83 83
 		return nil
84 84
 	}
85 85
 
86
+	// If Windows SCM manages the service - no need for PID files
87
+	if runAsService {
88
+		opts.daemonConfig.Pidfile = ""
89
+	}
90
+
86 91
 	err = daemonCli.start(opts)
87 92
 	notifyShutdown(err)
88 93
 	return err
... ...
@@ -6,8 +6,8 @@ import (
6 6
 	"github.com/spf13/pflag"
7 7
 )
8 8
 
9
-func initService(daemonCli *DaemonCli) (bool, error) {
10
-	return false, nil
9
+func initService(daemonCli *DaemonCli) (bool, bool, error) {
10
+	return false, false, nil
11 11
 }
12 12
 
13 13
 func installServiceFlags(flags *pflag.FlagSet) {
... ...
@@ -254,25 +254,28 @@ func unregisterService() error {
254 254
 	return nil
255 255
 }
256 256
 
257
-func initService(daemonCli *DaemonCli) (bool, error) {
257
+// initService is the entry point for running the daemon as a Windows
258
+// service. It returns an indication to stop (if registering/un-registering);
259
+// an indication of whether it is running as a service; and an error.
260
+func initService(daemonCli *DaemonCli) (bool, bool, error) {
258 261
 	if *flUnregisterService {
259 262
 		if *flRegisterService {
260
-			return true, errors.New("--register-service and --unregister-service cannot be used together")
263
+			return true, false, errors.New("--register-service and --unregister-service cannot be used together")
261 264
 		}
262
-		return true, unregisterService()
265
+		return true, false, unregisterService()
263 266
 	}
264 267
 
265 268
 	if *flRegisterService {
266
-		return true, registerService()
269
+		return true, false, registerService()
267 270
 	}
268 271
 
269 272
 	if !*flRunService {
270
-		return false, nil
273
+		return false, false, nil
271 274
 	}
272 275
 
273 276
 	interactive, err := svc.IsAnInteractiveSession()
274 277
 	if err != nil {
275
-		return false, err
278
+		return false, false, err
276 279
 	}
277 280
 
278 281
 	h := &handler{
... ...
@@ -285,7 +288,7 @@ func initService(daemonCli *DaemonCli) (bool, error) {
285 285
 	if !interactive {
286 286
 		log, err = eventlog.Open(*flServiceName)
287 287
 		if err != nil {
288
-			return false, err
288
+			return false, false, err
289 289
 		}
290 290
 	}
291 291
 
... ...
@@ -306,9 +309,9 @@ func initService(daemonCli *DaemonCli) (bool, error) {
306 306
 	// Wait for the first signal from the service handler.
307 307
 	err = <-h.fromsvc
308 308
 	if err != nil {
309
-		return false, err
309
+		return false, false, err
310 310
 	}
311
-	return false, nil
311
+	return false, true, nil
312 312
 }
313 313
 
314 314
 func (h *handler) started() error {