shepherd.scm 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. ;;; GNU Guix --- Functional package management for GNU
  2. ;;; Copyright © 2013-2016, 2018-2022 Ludovic Courtès <ludo@gnu.org>
  3. ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
  4. ;;; Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
  5. ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  6. ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
  7. ;;;
  8. ;;; This file is part of GNU Guix.
  9. ;;;
  10. ;;; GNU Guix is free software; you can redistribute it and/or modify it
  11. ;;; under the terms of the GNU General Public License as published by
  12. ;;; the Free Software Foundation; either version 3 of the License, or (at
  13. ;;; your option) any later version.
  14. ;;;
  15. ;;; GNU Guix is distributed in the hope that it will be useful, but
  16. ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. ;;; GNU General Public License for more details.
  19. ;;;
  20. ;;; You should have received a copy of the GNU General Public License
  21. ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
  22. (define-module (gnu services shepherd)
  23. #:use-module (guix ui)
  24. #:use-module (guix sets)
  25. #:use-module (guix gexp)
  26. #:use-module (guix store)
  27. #:use-module (guix records)
  28. #:use-module (guix packages)
  29. #:use-module (guix derivations) ;imported-modules, etc.
  30. #:use-module (guix utils)
  31. #:use-module (gnu services)
  32. #:use-module (gnu services herd)
  33. #:use-module (gnu packages admin)
  34. #:use-module (ice-9 match)
  35. #:use-module (ice-9 vlist)
  36. #:use-module (srfi srfi-1)
  37. #:use-module (srfi srfi-26)
  38. #:use-module (srfi srfi-34)
  39. #:use-module (srfi srfi-35)
  40. #:export (shepherd-configuration
  41. shepherd-configuration?
  42. shepherd-configuration-shepherd
  43. shepherd-configuration-services
  44. shepherd-root-service-type
  45. %shepherd-root-service
  46. shepherd-service-type
  47. shepherd-service
  48. shepherd-service?
  49. shepherd-service-documentation
  50. shepherd-service-provision
  51. shepherd-service-canonical-name
  52. shepherd-service-requirement
  53. shepherd-service-one-shot?
  54. shepherd-service-respawn?
  55. shepherd-service-start
  56. shepherd-service-stop
  57. shepherd-service-auto-start?
  58. shepherd-service-modules
  59. shepherd-action
  60. shepherd-action?
  61. shepherd-action-name
  62. shepherd-action-documentation
  63. shepherd-action-procedure
  64. %default-modules
  65. shepherd-service-file
  66. shepherd-service-lookup-procedure
  67. shepherd-service-back-edges
  68. shepherd-service-upgrade
  69. user-processes-service-type
  70. assert-valid-graph))
  71. ;;; Commentary:
  72. ;;;
  73. ;;; Instantiating system services as a shepherd configuration file.
  74. ;;;
  75. ;;; Code:
  76. (define-record-type* <shepherd-configuration>
  77. shepherd-configuration make-shepherd-configuration
  78. shepherd-configuration?
  79. (shepherd shepherd-configuration-shepherd
  80. (default shepherd-0.9)) ; file-like
  81. (services shepherd-configuration-services
  82. (default '()))) ; list of <shepherd-service>
  83. (define (shepherd-boot-gexp config)
  84. "Return a gexp starting the shepherd service."
  85. (let ((shepherd (shepherd-configuration-shepherd config))
  86. (services (shepherd-configuration-services config)))
  87. #~(begin
  88. ;; Keep track of the booted system.
  89. (false-if-exception (delete-file "/run/booted-system"))
  90. ;; Make /run/booted-system, an indirect GC root, point to the store item
  91. ;; /run/current-system points to. Use 'canonicalize-path' rather than
  92. ;; 'readlink' to make sure we get the store item.
  93. (symlink (canonicalize-path "/run/current-system")
  94. "/run/booted-system")
  95. ;; Ensure open file descriptors are close-on-exec so shepherd doesn't
  96. ;; inherit them.
  97. (let loop ((fd 3))
  98. (when (< fd 1024)
  99. (false-if-exception
  100. (let ((flags (fcntl fd F_GETFD)))
  101. (when (zero? (logand flags FD_CLOEXEC))
  102. (fcntl fd F_SETFD (logior FD_CLOEXEC flags)))))
  103. (loop (+ fd 1))))
  104. ;; Start shepherd.
  105. (execl #$(file-append shepherd "/bin/shepherd")
  106. "shepherd" "--config"
  107. #$(shepherd-configuration-file services shepherd)))))
  108. (define shepherd-packages
  109. (compose list shepherd-configuration-shepherd))
  110. (define shepherd-root-service-type
  111. (service-type
  112. (name 'shepherd-root)
  113. ;; Extending the root shepherd service (aka. PID 1) happens by
  114. ;; concatenating the list of services provided by the extensions.
  115. (compose concatenate)
  116. (extend (lambda (config extra-services)
  117. (shepherd-configuration
  118. (inherit config)
  119. (services (append (shepherd-configuration-services config)
  120. extra-services)))))
  121. (extensions (list (service-extension boot-service-type
  122. shepherd-boot-gexp)
  123. (service-extension profile-service-type
  124. shepherd-packages)))
  125. (default-value (shepherd-configuration))
  126. (description
  127. "Run the GNU Shepherd as PID 1---i.e., the operating system's first
  128. process. The Shepherd takes care of managing services such as daemons by
  129. ensuring they are started and stopped in the right order.")))
  130. (define %shepherd-root-service
  131. ;; The root shepherd service, aka. PID 1. Its parameter is a
  132. ;; <shepherd-configuration>.
  133. (service shepherd-root-service-type))
  134. (define-syntax shepherd-service-type
  135. (syntax-rules (description)
  136. "Return a <service-type> denoting a simple shepherd service--i.e., the type
  137. for a service that extends SHEPHERD-ROOT-SERVICE-TYPE and nothing else. When
  138. DEFAULT is given, use it as the service's default value."
  139. ((_ service-name proc default (description text))
  140. (service-type
  141. (name service-name)
  142. (extensions
  143. (list (service-extension shepherd-root-service-type
  144. (compose list proc))))
  145. (default-value default)
  146. (description text)))
  147. ((_ service-name proc (description text))
  148. (service-type
  149. (name service-name)
  150. (extensions
  151. (list (service-extension shepherd-root-service-type
  152. (compose list proc))))
  153. (description text)))))
  154. (define %default-imported-modules
  155. ;; Default set of modules imported for a service's consumption.
  156. '((guix build utils)
  157. (guix build syscalls)))
  158. (define %default-modules
  159. ;; Default set of modules visible in a service's file.
  160. `((shepherd service)
  161. (oop goops)
  162. ((guix build utils) #:hide (delete))
  163. (guix build syscalls)))
  164. (define-record-type* <shepherd-service>
  165. shepherd-service make-shepherd-service
  166. shepherd-service?
  167. (documentation shepherd-service-documentation ;string
  168. (default "[No documentation.]"))
  169. (provision shepherd-service-provision) ;list of symbols
  170. (requirement shepherd-service-requirement ;list of symbols
  171. (default '()))
  172. (one-shot? shepherd-service-one-shot? ;Boolean
  173. (default #f))
  174. (respawn? shepherd-service-respawn? ;Boolean
  175. (default #t))
  176. (start shepherd-service-start) ;g-expression (procedure)
  177. (stop shepherd-service-stop ;g-expression (procedure)
  178. (default #~(const #f)))
  179. (actions shepherd-service-actions ;list of <shepherd-action>
  180. (default '()))
  181. (auto-start? shepherd-service-auto-start? ;Boolean
  182. (default #t))
  183. (modules shepherd-service-modules ;list of module names
  184. (default %default-modules)))
  185. (define-record-type* <shepherd-action>
  186. shepherd-action make-shepherd-action
  187. shepherd-action?
  188. (name shepherd-action-name) ;symbol
  189. (procedure shepherd-action-procedure) ;gexp
  190. (documentation shepherd-action-documentation)) ;string
  191. (define (shepherd-service-canonical-name service)
  192. "Return the 'canonical name' of SERVICE."
  193. (first (shepherd-service-provision service)))
  194. (define (assert-valid-graph services)
  195. "Raise an error if SERVICES does not define a valid shepherd service graph,
  196. for instance if a service requires a nonexistent service, or if more than one
  197. service uses a given name.
  198. These are constraints that shepherd's 'register-service' verifies but we'd
  199. better verify them here statically than wait until PID 1 halts with an
  200. assertion failure."
  201. (define provisions
  202. ;; The set of provisions (symbols). Bail out if a symbol is given more
  203. ;; than once.
  204. (fold (lambda (service set)
  205. (define (assert-unique symbol)
  206. (when (set-contains? set symbol)
  207. (raise (condition
  208. (&message
  209. (message
  210. (format #f (G_ "service '~a' provided more than once")
  211. symbol)))))))
  212. (for-each assert-unique (shepherd-service-provision service))
  213. (fold set-insert set (shepherd-service-provision service)))
  214. (setq 'shepherd)
  215. services))
  216. (define (assert-satisfied-requirements service)
  217. ;; Bail out if the requirements of SERVICE aren't satisfied.
  218. (for-each (lambda (requirement)
  219. (unless (set-contains? provisions requirement)
  220. (raise (condition
  221. (&message
  222. (message
  223. (format #f (G_ "service '~a' requires '~a', \
  224. which is not provided by any service")
  225. (match (shepherd-service-provision service)
  226. ((head . _) head)
  227. (_ service))
  228. requirement)))))))
  229. (shepherd-service-requirement service)))
  230. (for-each assert-satisfied-requirements services))
  231. (define %store-characters
  232. ;; Valid store characters; see 'checkStoreName' in the daemon.
  233. (string->char-set
  234. "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-._?="))
  235. (define (shepherd-service-file-name service)
  236. "Return the file name where the initialization code for SERVICE is to be
  237. stored."
  238. (let ((provisions (string-join (map symbol->string
  239. (shepherd-service-provision service)))))
  240. (string-append "shepherd-"
  241. (string-map (lambda (chr)
  242. (if (char-set-contains? %store-characters chr)
  243. chr
  244. #\-))
  245. provisions)
  246. ".scm")))
  247. (define (shepherd-service-file service)
  248. "Return a file defining SERVICE."
  249. (scheme-file (shepherd-service-file-name service)
  250. (with-imported-modules %default-imported-modules
  251. #~(begin
  252. (use-modules #$@(shepherd-service-modules service))
  253. (make <service>
  254. #:docstring '#$(shepherd-service-documentation service)
  255. #:provides '#$(shepherd-service-provision service)
  256. #:requires '#$(shepherd-service-requirement service)
  257. ;; The 'one-shot?' slot is new in Shepherd 0.6.0.
  258. ;; Older versions ignore it.
  259. #:one-shot? '#$(shepherd-service-one-shot? service)
  260. #:respawn? '#$(shepherd-service-respawn? service)
  261. #:start #$(shepherd-service-start service)
  262. #:stop #$(shepherd-service-stop service)
  263. #:actions
  264. (make-actions
  265. #$@(map (match-lambda
  266. (($ <shepherd-action> name proc doc)
  267. #~(#$name #$doc #$proc)))
  268. (shepherd-service-actions service))))))))
  269. (define (scm->go file shepherd)
  270. "Compile FILE, which contains code to be loaded by shepherd's config file,
  271. and return the resulting '.go' file. SHEPHERD is used as shepherd package."
  272. (define shepherd&co
  273. (cons shepherd
  274. (match (lookup-package-input shepherd "guile-fibers")
  275. (#f '())
  276. (fibers (list fibers)))))
  277. (let-system (system target)
  278. (with-extensions shepherd&co
  279. (computed-file (string-append (basename (scheme-file-name file) ".scm")
  280. ".go")
  281. #~(begin
  282. (use-modules (system base compile)
  283. (system base target))
  284. ;; Do the same as the Shepherd's 'load-in-user-module'.
  285. (let ((env (make-fresh-user-module)))
  286. (module-use! env (resolve-interface '(oop goops)))
  287. (module-use! env (resolve-interface '(shepherd service)))
  288. (with-target #$(or target #~%host-type)
  289. (lambda _
  290. (compile-file #$file #:output-file #$output
  291. #:env env)))))
  292. ;; It's faster to build locally than to download.
  293. #:options '(#:local-build? #t
  294. #:substitutable? #f)))))
  295. (define (shepherd-configuration-file services shepherd)
  296. "Return the shepherd configuration file for SERVICES. SHEPHERD is used
  297. as shepherd package."
  298. (assert-valid-graph services)
  299. (let ((files (map shepherd-service-file services))
  300. (scm->go (cute scm->go <> shepherd)))
  301. (define config
  302. #~(begin
  303. (use-modules (srfi srfi-34)
  304. (system repl error-handling))
  305. (define (call-with-file file flags proc)
  306. (let ((port #f))
  307. (dynamic-wind
  308. (lambda ()
  309. (set! port (open file flags)))
  310. (lambda ()
  311. (proc port))
  312. (lambda ()
  313. (close-port port)
  314. (set! port #f)))))
  315. ;; There's code run from shepherd that uses 'call-with-input-file' &
  316. ;; co.--e.g., the 'urandom-seed' service. Starting from Shepherd
  317. ;; 0.9.2, users need to make sure not to leak non-close-on-exec file
  318. ;; descriptors to child processes. To address that, replace the
  319. ;; standard bindings with O_CLOEXEC variants.
  320. (set! call-with-input-file
  321. (lambda (file proc)
  322. (call-with-file file (logior O_RDONLY O_CLOEXEC)
  323. proc)))
  324. (set! call-with-output-file
  325. (lambda (file proc)
  326. (call-with-file file (logior O_WRONLY O_CREAT O_CLOEXEC)
  327. proc)))
  328. ;; Specify the default environment visible to all the services.
  329. ;; Without this statement, all the environment variables of PID 1
  330. ;; are inherited by child services.
  331. (default-environment-variables
  332. '("PATH=/run/current-system/profile/bin"))
  333. ;; Booting off a DVD, especially on a slow machine, can make
  334. ;; everything slow. Thus, increase the timeout compared to the
  335. ;; default 5s in the Shepherd 0.7.0. See
  336. ;; <https://bugs.gnu.org/40572>.
  337. (default-pid-file-timeout 30)
  338. ;; Arrange to spawn a REPL if something goes wrong. This is better
  339. ;; than a kernel panic.
  340. (call-with-error-handling
  341. (lambda ()
  342. (apply register-services
  343. (parameterize ((current-warning-port
  344. (%make-void-port "w")))
  345. (map load-compiled '#$(map scm->go files))))))
  346. (format #t "starting services...~%")
  347. (let ((services-to-start
  348. '#$(append-map shepherd-service-provision
  349. (filter shepherd-service-auto-start?
  350. services))))
  351. (if (defined? 'start-in-the-background)
  352. (start-in-the-background services-to-start)
  353. (for-each (lambda (service) ;pre-0.9.0 compatibility
  354. (guard (c ((service-error? c)
  355. (format (current-error-port)
  356. "failed to start service '~a'~%"
  357. service)))
  358. (start service)))
  359. services-to-start))
  360. ;; Hang up stdin. At this point, we assume that 'start' methods
  361. ;; that required user interaction on the console (e.g.,
  362. ;; 'cryptsetup open' invocations, post-fsck emergency REPL) have
  363. ;; completed. User interaction becomes impossible after this
  364. ;; call; this avoids situations where services wrongfully lead
  365. ;; PID 1 to read from stdin (the console), which users may not
  366. ;; have access to (see <https://bugs.gnu.org/23697>).
  367. (redirect-port (open "/dev/null" (logior O_RDONLY O_CLOEXEC))
  368. (current-input-port)))))
  369. (scheme-file "shepherd.conf" config)))
  370. (define* (shepherd-service-lookup-procedure services
  371. #:optional
  372. (provision
  373. shepherd-service-provision))
  374. "Return a procedure that, when passed a symbol, return the item among
  375. SERVICES that provides this symbol. PROVISION must be a one-argument
  376. procedure that takes a service and returns the list of symbols it provides."
  377. (let ((services (fold (lambda (service result)
  378. (fold (cut vhash-consq <> service <>)
  379. result
  380. (provision service)))
  381. vlist-null
  382. services)))
  383. (lambda (name)
  384. (match (vhash-assq name services)
  385. ((_ . service) service)
  386. (#f #f)))))
  387. (define* (shepherd-service-back-edges services
  388. #:key
  389. (provision shepherd-service-provision)
  390. (requirement shepherd-service-requirement))
  391. "Return a procedure that, when given a <shepherd-service> from SERVICES,
  392. returns the list of <shepherd-service> that depend on it.
  393. Use PROVISION and REQUIREMENT as one-argument procedures that return the
  394. symbols provided/required by a service."
  395. (define provision->service
  396. (shepherd-service-lookup-procedure services provision))
  397. (define edges
  398. (fold (lambda (service edges)
  399. (fold (lambda (requirement edges)
  400. (vhash-consq (provision->service requirement) service
  401. edges))
  402. edges
  403. (requirement service)))
  404. vlist-null
  405. services))
  406. (lambda (service)
  407. (vhash-foldq* cons '() service edges)))
  408. (define (shepherd-service-upgrade live target)
  409. "Return two values: the subset of LIVE (a list of <live-service>) that needs
  410. to be unloaded, and the subset of TARGET (a list of <shepherd-service>) that
  411. need to be restarted to complete their upgrade."
  412. (define (essential? service)
  413. (memq (first (live-service-provision service))
  414. '(root shepherd)))
  415. (define lookup-target
  416. (shepherd-service-lookup-procedure target
  417. shepherd-service-provision))
  418. (define lookup-live
  419. (shepherd-service-lookup-procedure live
  420. live-service-provision))
  421. (define (running? service)
  422. (and=> (lookup-live (shepherd-service-canonical-name service))
  423. live-service-running))
  424. (define live-service-dependents
  425. (shepherd-service-back-edges live
  426. #:provision live-service-provision
  427. #:requirement live-service-requirement))
  428. (define (obsolete? service)
  429. (match (lookup-target (first (live-service-provision service)))
  430. (#f (every obsolete? (live-service-dependents service)))
  431. (_ #f)))
  432. (define to-restart
  433. ;; Restart services that are currently running.
  434. (filter running? target))
  435. (define to-unload
  436. ;; Unload services that are no longer required. Essential services must
  437. ;; be kept and transient services such as inetd child services should be
  438. ;; kept as well--they'll vanish eventually.
  439. (remove (lambda (live)
  440. (or (essential? live)
  441. (live-service-transient? live)))
  442. (filter obsolete? live)))
  443. (values to-unload to-restart))
  444. ;;;
  445. ;;; User processes.
  446. ;;;
  447. (define %do-not-kill-file
  448. ;; Name of the file listing PIDs of processes that must survive when halting
  449. ;; the system. Typical example is user-space file systems.
  450. "/etc/shepherd/do-not-kill")
  451. (define (user-processes-shepherd-service requirements)
  452. "Return the 'user-processes' Shepherd service with dependencies on
  453. REQUIREMENTS (a list of service names).
  454. This is a synchronization point used to make sure user processes and daemons
  455. get started only after crucial initial services have been started---file
  456. system mounts, etc. This is similar to the 'sysvinit' target in systemd."
  457. (define grace-delay
  458. ;; Delay after sending SIGTERM and before sending SIGKILL.
  459. 4)
  460. (list (shepherd-service
  461. (documentation "When stopped, terminate all user processes.")
  462. (provision '(user-processes))
  463. (requirement requirements)
  464. (start #~(const #t))
  465. (stop #~(lambda _
  466. (define (kill-except omit signal)
  467. ;; Kill all the processes with SIGNAL except those listed
  468. ;; in OMIT and the current process.
  469. (let ((omit (cons (getpid) omit)))
  470. (for-each (lambda (pid)
  471. (unless (memv pid omit)
  472. (false-if-exception
  473. (kill pid signal))))
  474. (processes))))
  475. (define omitted-pids
  476. ;; List of PIDs that must not be killed.
  477. (if (file-exists? #$%do-not-kill-file)
  478. (map string->number
  479. (call-with-input-file #$%do-not-kill-file
  480. (compose string-tokenize
  481. (@ (ice-9 rdelim) read-string))))
  482. '()))
  483. (define (now)
  484. (car (gettimeofday)))
  485. (define (sleep* n)
  486. ;; Really sleep N seconds.
  487. ;; Work around <http://bugs.gnu.org/19581>.
  488. (define start (now))
  489. (let loop ((elapsed 0))
  490. (when (> n elapsed)
  491. (sleep (- n elapsed))
  492. (loop (- (now) start)))))
  493. (define lset= (@ (srfi srfi-1) lset=))
  494. (display "sending all processes the TERM signal\n")
  495. (if (null? omitted-pids)
  496. (begin
  497. ;; Easy: terminate all of them.
  498. (kill -1 SIGTERM)
  499. (sleep* #$grace-delay)
  500. (kill -1 SIGKILL))
  501. (begin
  502. ;; Kill them all except OMITTED-PIDS. XXX: We would
  503. ;; like to (kill -1 SIGSTOP) to get a fixed list of
  504. ;; processes, like 'killall5' does, but that seems
  505. ;; unreliable.
  506. (kill-except omitted-pids SIGTERM)
  507. (sleep* #$grace-delay)
  508. (kill-except omitted-pids SIGKILL)
  509. (delete-file #$%do-not-kill-file)))
  510. (let wait ()
  511. ;; Reap children, if any, so that we don't end up with
  512. ;; zombies and enter an infinite loop.
  513. (let reap-children ()
  514. (define result
  515. (false-if-exception
  516. (waitpid WAIT_ANY (if (null? omitted-pids)
  517. 0
  518. WNOHANG))))
  519. (when (and (pair? result)
  520. (not (zero? (car result))))
  521. (reap-children)))
  522. (let ((pids (processes)))
  523. (unless (lset= = pids (cons 1 omitted-pids))
  524. (format #t "waiting for process termination\
  525. (processes left: ~s)~%"
  526. pids)
  527. (sleep* 2)
  528. (wait))))
  529. (display "all processes have been terminated\n")
  530. #f))
  531. (respawn? #f))))
  532. (define user-processes-service-type
  533. (service-type
  534. (name 'user-processes)
  535. (extensions (list (service-extension shepherd-root-service-type
  536. user-processes-shepherd-service)))
  537. (compose concatenate)
  538. (extend append)
  539. ;; The value is the list of Shepherd services 'user-processes' depends on.
  540. ;; Extensions can add new services to this list.
  541. (default-value '())
  542. (description "The @code{user-processes} service is responsible for
  543. terminating all the processes so that the root file system can be re-mounted
  544. read-only, just before rebooting/halting. Processes still running after a few
  545. seconds after @code{SIGTERM} has been sent are terminated with
  546. @code{SIGKILL}.")))
  547. ;;; shepherd.scm ends here