Common Lisp: Run function in the background

865 views Asked by At

What's the best way to run a function in the background, in Common Lisp? Specifically, I'm making a call like (trivial-shell:shell-command "<long and complicated command>". This operation is blocking for ~10 seconds, but I don't care for the output, just the side effect - so I want it to be run in the background, so that program flow can continue. I've tried wrapping the whole thing in sb-thread:make-thread, but that didn't appear to make a difference.

I'd avoid getting wrapped up in all kinds of complicated threading, if at all possible. I'm running SBCL 1.1.18 on 64-bit Gentoo Linux.

2

There are 2 answers

0
waterloos On

Here is the example with cl-async and bordeaux-thread packages on SBCL. Suppose you have a shell script ./echo.sh at the current directory. You can run the script at the background. After the invocation of the script, the following code is immediately evaluated so you get Waiting..... on your screen. After the script is done, the notifier is triggered and displays Threaded job done.

Make sure the *features* contains SB-THREAD as @coredump says.

(require 'cl-async)
(require 'bordeaux-threads)

(as:with-event-loop()
  (let ((notifier (as:make-notifier
                    (lambda ()
                       (format t "Threaded job done.~%")
                       (as:exit-event-loop)))))
    (format t "App started.~%")
    (bt:make-thread (lambda ()
                       (sb-ext:run-program "/bin/bash" (list "./echo.sh"))
                       (as:trigger-notifier notifier))))
  (format t "Waiting......~%"))

If you want to capture the stdout of shell script, add :output t to the argument of sb-ext:run-program.

0
Ehvince On

My little investigation: it looks like the only solution is Renzo's answer: the launch-program function of UIOP.

Otherwise in order to run shell commands there is