diff --git a/Shelly/Background.hs b/Shelly/Background.hs
--- a/Shelly/Background.hs
+++ b/Shelly/Background.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
 module Shelly.Background (
    -- * Running external commands asynchronously.
    jobs, background, getBgResult, BgResult
@@ -6,6 +6,8 @@
 
 import Shelly
 import Control.Concurrent
+import Control.Exception (finally, catch, throw, SomeException)
+import Prelude hiding (catch)
 import qualified Control.Concurrent.MSem as Sem
 
 -- | Create a 'BgJobManager' that has a 'limit' on the max number of background tasks.
@@ -49,9 +51,14 @@
     Sem.wait manager
     mvar <- newEmptyMVar -- future result
 
+    mainTid <- myThreadId
     _<- forkIO $ do
-      result <- shelly $ (put state >> proc)
-      Sem.signal manager -- open a spot back up
-      liftIO $ putMVar mvar result
+      result <-
+        finally (
+            (shelly $ (put state >> proc)) `catch`
+              (\(e::SomeException) -> throwTo mainTid e >> throw e)
+          )
+          (Sem.signal manager >> return ()) -- open a spot back up
+      putMVar mvar result
     return $ BgResult mvar
 
diff --git a/shelly-extra.cabal b/shelly-extra.cabal
--- a/shelly-extra.cabal
+++ b/shelly-extra.cabal
@@ -1,6 +1,6 @@
 Name:       shelly-extra
 
-Version:     0.2
+Version:     0.2.1
 Synopsis:    shelly features that require extra dependencies
 
 Description: Please see the shelly package. Shelly provides a single module for convenient
