diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2025-02-13 11:12:13 +0100 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2025-02-21 15:27:12 +0100 |
| commit | e36d6ab24b7f405d191f7bf84f0db949c0ee72c0 (patch) | |
| tree | 33c7e368883d3f64de5f0390bca4f4b0a1e18136 /gnu/services/web.scm | |
| parent | 9f77db78e6b48cc0e9aa30ef2a223c309703a18e (diff) | |
services: Use ‘spawn-command’ instead of ‘fork’ + ‘waitpid’.
Fixes <https://issues.guix.gnu.org/76315>.
This is more concise and more robust: these ‘waitpid’ calls would
compete with those made by shepherd’s event loop upon SIGCHLD, and they
could hang forever, as illustrated with ‘dhcp-client-service-type’
in <https://issues.guix.gnu.org/76315>.
* gnu/services/databases.scm (postgresql-role-shepherd-service): Use
‘spawn-command’ instead of ‘fork+exec-command’ followed by ‘waitpid’.
* gnu/services/networking.scm (dhcp-client-shepherd-service): Change
‘start’ to use ‘spawn-command’ instead of ‘fork+exec-command’ and
* gnu/services/web.scm (patchwork-django-admin-gexp): Use
‘spawn-command’ instead of ‘primitive-fork’ + ‘waitpid’.
Change-Id: I449290bfa46f8600e6ccdb5a6da990ad0cb7948c
Reported-by: Tomas Volf <~@wolfsden.cz>
Diffstat (limited to 'gnu/services/web.scm')
| -rw-r--r-- | gnu/services/web.scm | 31 |
1 files changed, 9 insertions, 22 deletions
diff --git a/gnu/services/web.scm b/gnu/services/web.scm index f5de5997acb..d42ef09c3c0 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson <davet@gnu.org> -;;; Copyright © 2015-2023 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2015-2023, 2025 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016 Nikita <nikita@n0.is> ;;; Copyright © 2016, 2017, 2018 Julien Lepiller <julien@lepiller.eu> ;;; Copyright © 2017, 2018, 2019 Christopher Baines <mail@cbaines.net> @@ -1902,27 +1902,14 @@ WSGIPassAuthorization On (define (patchwork-django-admin-gexp patchwork settings-module) #~(lambda command - (let ((pid (primitive-fork)) - (user (getpwnam "httpd"))) - (if (eq? pid 0) - (dynamic-wind - (const #t) - (lambda () - (setgid (passwd:gid user)) - (setuid (passwd:uid user)) - - (setenv "DJANGO_SETTINGS_MODULE" "guix.patchwork.settings") - (setenv "PYTHONPATH" #$settings-module) - (primitive-exit - (if (zero? - (apply system* - #$(file-append patchwork "/bin/patchwork-admin") - command)) - 0 - 1))) - (lambda () - (primitive-exit 1))) - (zero? (cdr (waitpid pid))))))) + (zero? (spawn-command + `(#$(file-append patchwork "/bin/patchwork-admin") + ,command) + #:user "httpd" + #:group "httpd" + #:environment-variables + `("DJANGO_SETTINGS_MODULE=guix.patchwork.settings" + ,(string-append "PYTHONPATH=" #$settings-module)))))) (define (patchwork-django-admin-action patchwork settings-module) (shepherd-action |
