On Tue, Jan 26, 2021 at 11:02:58AM -0600, Cameron wrote: > Hello again everyone! > > I'm having a great time learning about Guix, but am struggling with defining a custom service for Caddy. The 'caddy' package below works as expected -- installing it puts the "caddy" binary in $PATH and it works fine when I run it from a shell. > > > #+begin_src > #+end_src > > What doesn't work as expected is this service definition: > > #+begin_src > (define-record-type* > caddy-configuration make-caddy-configuration caddy-configuration? > (config-file caddy-configuration-config-file > (default "/etc/Caddyfile"))) > > (define caddy-service-type > (shepherd-service-type > 'caddy > (lambda (config) > (shepherd-service > (documentation "Run the caddy daemon (caddy).") > (provision '(caddy)) > (requirement '(user-processes)) > (start #~(make-forkexec-constructor > (list "caddy" "run" > "-config" "/etc/Caddyfile") > #:log-file "/var/log/caddy.log")) > (stop #~(make-kill-destructor)))))) > #+end_src > > ...which I then add to my services list in config.scm like this: > > #+begin_src > (service caddy-service-type > (caddy-configuration > (config-file "/etc/Caddyfile"))) > #+end_src > > With this setup, 'herd start caddy' hangs for 30 seconds, during which time the server is active and taking traffic according to the config in /etc/Caddyfile but then something (presumably Shepherd) sends it a SIGTERM and it dutifully shuts down. The 'herd start caddy' then exits with an error: > > #+begin_src > root@tindall ~# START=$(date +%s); herd start caddy; END=$(date +%s); echo $(($END - START)) > Service caddy could not be started. > herd: failed to start service caddy > 30 > root@tindall ~# tail -n 1 /var/log/caddy.log > {"level":"info","ts":1611680035.1811087,"msg":"shutdown done","signal":"SIGTERM"} > root@tindall ~# > #+end_src > > 'caddy run' will keep caddy in the foreground, but I see the same behavior when I use 'caddy start' (which forks another process for the daemon and exits immediately) in the service definition instead. > > I suspect something is wrong with the 'start' procedure I've defined, but I'm struggling to figure out what it is. > > What am I missing? > > -Cameron > Does caddy fork when you run "caddy run?" 'make-fork-constructor' forks when it runs the code, so if caddy also forks then you have a double-forked codepath and shepherd thinks the process is gone, so it goes to kill it. If caddy doesn't have something like --foreground or --no-daemonize then you might be looking at something like exec-command from the manual¹. Alternatively it might work if you can set a PID file. ¹ https://www.gnu.org/software/shepherd/manual/html_node/Service-De_002d-and-Constructors.html#Service-De_002d-and-Constructors -- Efraim Flashner אפרים פלשנר GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted