diff options
author | Ludovic Courtès <ludo@gnu.org> | 2018-01-15 16:01:10 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2018-01-15 23:29:33 +0100 |
commit | 95aa64bc48cae061effafa7675ea9d9ccbe311a4 (patch) | |
tree | ae4237665f6db07c84a02da995b362f499069e84 /gnu/build/linux-container.scm | |
parent | 92423868bc451600f8f3d93b638091d12b14b7aa (diff) | |
download | guix-95aa64bc48cae061effafa7675ea9d9ccbe311a4.tar guix-95aa64bc48cae061effafa7675ea9d9ccbe311a4.tar.gz |
linux-container: Work around EBADF errors upon exit.
Typically 'read-pid-file/container' would fail when starting services in
containers such as BitlBee.
* gnu/build/linux-container.scm (call-with-clean-exit): Use
'primitive-_exit' instead of 'primitive-exit'.
(container-excursion*): Close OUT.
Diffstat (limited to 'gnu/build/linux-container.scm')
-rw-r--r-- | gnu/build/linux-container.scm | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/gnu/build/linux-container.scm b/gnu/build/linux-container.scm index 70e789403f..65e1325577 100644 --- a/gnu/build/linux-container.scm +++ b/gnu/build/linux-container.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson <davet@gnu.org> -;;; Copyright © 2017 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -61,9 +61,14 @@ exists." (const #t) (lambda () (thunk) - (primitive-exit 0)) + + ;; XXX: Somehow we sometimes get EBADF from write(2) or close(2) upon + ;; exit (coming from fd finalizers) when used by the Shepherd. To work + ;; around that, exit forcefully so fd finalizers don't have a chance to + ;; run and fail. + (primitive-_exit 0)) (lambda () - (primitive-exit 1)))) + (primitive-_exit 1)))) (define (purify-environment) "Unset all environment variables." @@ -335,7 +340,8 @@ return the exit status." (match (container-excursion pid (lambda () (close-port in) - (write (thunk) out))) + (write (thunk) out) + (close-port out))) (0 (close-port out) (let ((result (read in))) |