[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[shepherd] 04/05: service: Add ‘start-command’.
From: |
Ludovic Courtès |
Subject: |
[shepherd] 04/05: service: Add ‘start-command’. |
Date: |
Mon, 18 Mar 2024 17:53:02 -0400 (EDT) |
civodul pushed a commit to branch wip-timers
in repository shepherd.
commit a801c2e087598985242108118cbb8109e7206c36
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Mon Mar 18 22:27:14 2024 +0100
service: Add ‘start-command’.
This allows for race-free fork + waitpid, similar to
‘spawn-via-monitor’, but split-phase.
* modules/shepherd/service.scm (start-command): New procedure.
---
modules/shepherd/service.scm | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm
index b02587b..7ef2ff0 100644
--- a/modules/shepherd/service.scm
+++ b/modules/shepherd/service.scm
@@ -94,6 +94,7 @@
respawn-service
handle-SIGCHLD
with-process-monitor
+ start-command
spawn-command
spawn-shell-command
%precious-signals
@@ -2716,6 +2717,17 @@ context. The process monitoring fiber is responsible
for handling
@code{SIGCHLD} and generally dealing with process creation and termination."
(call-with-process-monitor (lambda () exp ...)))
+(define (start-command command . arguments)
+ "Start a process executing @var{command}, as per @code{fork+exec-command},
but
+immediately monitor its PID. Return two values: its PID and a channel on
+which its completion status will be sent."
+ (let ((reply (make-channel)))
+ (put-message (current-process-monitor)
+ `(spawn ,(cons command arguments) ,(current-service)
+ ,reply))
+ (values (unboxed-errors (get-message reply))
+ reply)))
+
(define (spawn-via-monitor arguments)
(let ((reply (make-channel)))
(put-message (current-process-monitor)