services: nginx: Get the Shepherd to respawn NGINX.

* gnu/services/web.scm (nginx-shepherd-service): Change 'start' (that is, all
actions that don't send a signal to the master process) to return the PID.
Wait until the PID file is created and contains an integer because it might be
created after the parent process exits.
This commit is contained in:
Clément Lassieur 2018-08-13 21:05:55 +02:00
parent 0b6678cd44
commit 9fc2922794
No known key found for this signature in database
GPG key ID: 89F96D4808F359C7

View file

@ -599,19 +599,33 @@ (define (nginx-shepherd-service config)
<nginx-configuration>
(nginx file run-directory)
(let* ((nginx-binary (file-append nginx "/sbin/nginx"))
(pid-file (in-vicinity run-directory "pid"))
(nginx-action
(lambda args
#~(lambda _
(invoke #$nginx-binary "-c"
#$(or file
(default-nginx-config config))
#$@args)))))
#$@args)
(match '#$args
(("-s" . _) #t)
(_
(let loop ((duration 0))
;; https://bugs.launchpad.net/ubuntu/+source/nginx/+bug/1581864/comments/7
(sleep duration)
(if (file-exists? #$pid-file)
(let ((pid (call-with-input-file #$pid-file read)))
;; it could be #<eof>
(if (integer? pid) pid (loop 1)))
(loop 1)))))))))
;; TODO: Add 'reload' action.
(list (shepherd-service
(provision '(nginx))
(documentation "Run the nginx daemon.")
(requirement '(user-processes loopback))
(modules `((ice-9 match)
,@%default-modules))
(start (nginx-action "-p" run-directory))
(stop (nginx-action "-s" "stop")))))))