(address . guix-patches@gnu.org)
* modules/shepherd/service.scm: add keep-tty flag to skip setsid
when using shepherd as user, programs like xorg server,
potentially any
program which ends up interacting with user, require terminal to
remain.
currently, setsid is called unconditionally from exec-command
function,
making it impossible to have such process.
this adds keep-tty flag to make-forkexec-constructor up to
exec-command
function where setsid is actually called.
Toggle diff (64 lines)
diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm
index 587ff68..1ae9544 100644
--- a/modules/shepherd/service.scm
+++ b/modules/shepherd/service.scm
@@ -786,6 +786,7 @@ daemon writing FILE is running in a separate PID namespace."
(log-file #f)
(directory (default-service-directory))
(file-creation-mask #f)
+ (keep-tty #f)
(environment-variables (default-environment-variables)))
"Run COMMAND as the current process from DIRECTORY, with FILE-CREATION-MASK
if it's true, and with ENVIRONMENT-VARIABLES (a list of strings like
@@ -804,7 +805,7 @@ false."
((program args ...)
;; Become the leader of a new session and session group.
;; Programs such as 'mingetty' expect this.
- (setsid)
+ (unless keep-tty (setsid))
(chdir directory)
(environ environment-variables)
@@ -889,6 +890,7 @@ false."
(log-file #f)
(directory (default-service-directory))
(file-creation-mask #f)
+ (keep-tty #f)
(environment-variables
(default-environment-variables)))
"Spawn a process that executed COMMAND as per 'exec-command', and return
@@ -920,6 +922,7 @@ its PID."
#:log-file log-file
#:directory directory
#:file-creation-mask file-creation-mask
+ #:keep-tty keep-tty
#:environment-variables environment-variables))
pid))))
@@ -929,6 +932,7 @@ its PID."
(group #f)
(supplementary-groups '())
(directory (default-service-directory))
+ (keep-tty #f)
(environment-variables
(default-environment-variables))
(file-creation-mask #f)
@@ -949,7 +953,9 @@ When @var{pid-file} is true, it must be the name of a PID file associated with
the process being launched; the return value is the PID read from that file,
once that file has been created. If @var{pid-file} does not show up in less
than @var{pid-file-timeout} seconds, the service is considered as failing to
-start."
+start.
+
+When @var{keep-tty} is true, will not call @code{setsid} for process."
(lambda args
(define (clean-up file)
(when file
@@ -969,6 +975,7 @@ start."
#:log-file log-file
#:directory directory
#:file-creation-mask file-creation-mask
+ #:keep-tty keep-tty
#:environment-variables
environment-variables)))
(if pid-file