diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -57,11 +57,7 @@
   tasks: 
     - "stack build"
   run:
-    - command: "target/executable"
-      workingDir: "target"
-      env:
-        - ["HOST", "localhost"]
-        - ["PORT", "1234"]
+    - "target/executable"      
 ```
 
 Which consists of:
@@ -70,7 +66,4 @@
 - `files`: one or more file globs. Files that don't match will not trigger. 
 - `ignore`: (optional) one or more file globs. Overrides the above file globs to exclude particular files. 
 - `tasks`: (optional) one or more tasks, which are run sequentially in the foreground. Any error will stop subsequent tasks.
-- `run`: (optional) one or more background processes. *Note: this executes the command directly, rather than using the shell, to improve shutdown behaviour.*
-  - `command`: command and arguments to run in background. *Note: this command is relative to where you start trigger, not the `workingDir`.*
-  - `workingDir`: (optional) override the working directory of the process.
-  - `env`: (optional) additional environment variables for the process
+- `run`: (optional) one or more background processes.
diff --git a/src/Parser.hs b/src/Parser.hs
--- a/src/Parser.hs
+++ b/src/Parser.hs
@@ -2,7 +2,6 @@
 
 module Parser
   ( Config(..)
-  , RunConfig(..)
   , loadAndParse
   ) where
 
@@ -15,19 +14,10 @@
   , _files :: [Text]
   , _ignore :: Maybe [Text]
   , _tasks :: Maybe [Text]
-  , _run   :: Maybe [RunConfig]
+  , _run   :: Maybe [Text]
   } deriving (Eq, Show, Generic)
 
 instance Y.FromJSON Config where
-  parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = drop 1}
-
-data RunConfig = RunConfig
-  { _workingDir :: Maybe Text
-  , _command :: Text
-  , _env :: Maybe [(Text,Text)]
-  } deriving (Eq, Show, Generic)
-
-instance Y.FromJSON RunConfig where
   parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = drop 1}
 
 loadAndParse :: FilePath -> IO [Config]
diff --git a/src/Trigger.hs b/src/Trigger.hs
--- a/src/Trigger.hs
+++ b/src/Trigger.hs
@@ -75,11 +75,12 @@
     ExitSuccess   -> return ()
     ExitFailure _ -> throwIO exitCode
 
-startProcess :: RunConfig -> IO RunningProcess
-startProcess RunConfig {..} = do
-  (_, _, _, processHandle) <- P.createProcess_ (toS _command) $ process _workingDir _env _command
-  printStartingRunTask _command
-  return $ RunningProcess _command processHandle
+startProcess :: Text -> IO RunningProcess
+startProcess command = do
+  (_, _, _, processHandle) <- P.createProcess_ (toS command) $ (P.shell (toS command)) { P.use_process_jobs = True
+                                                                                       , P.create_group = True }
+  printStartingRunTask command
+  return $ RunningProcess command processHandle
 
 terminate :: RunningProcess -> IO ()
 terminate RunningProcess {..} = do
@@ -87,34 +88,7 @@
   exit <- P.getProcessExitCode processHandle
   case exit of
     Nothing -> do
-      P.terminateProcess processHandle
+      P.interruptProcessGroupOf processHandle
       exitCode <- P.waitForProcess processHandle
       printTerminated cmd exitCode
     Just exitCode -> printAlreadyTerminated cmd exitCode
-
-process :: Maybe Text -> Maybe [(Text, Text)] -> Text -> P.CreateProcess
-process workingDir env command =
-  P.CreateProcess
-  { cmdspec = splitCommand command
-  , cwd = map toS workingDir
-  , env = map (map (toS A.*** toS)) env
-  , std_in = P.Inherit
-  , std_out = P.Inherit
-  , std_err = P.Inherit
-  , close_fds = False
-  , create_group = False
-  , delegate_ctlc = False
-  , detach_console = False
-  , create_new_console = False
-  , new_session = False
-  , child_group = Nothing
-  , child_user = Nothing
-  , use_process_jobs = True
-  }
-
-splitCommand :: Text -> P.CmdSpec
-splitCommand command =
-  let cmdAndArgs = T.words command
-      cmd = fromMaybe T.empty (head cmdAndArgs)
-      args = L.tail cmdAndArgs
-  in P.RawCommand (toS cmd) (map toS args)
diff --git a/test/ParserSpec.hs b/test/ParserSpec.hs
--- a/test/ParserSpec.hs
+++ b/test/ParserSpec.hs
@@ -11,5 +11,5 @@
   it "can parse example.yaml" $ do
     config <- loadAndParse "example/example.yaml"
     config `shouldBe` 
-      [ Config ["src"] ["**/*.hs"] Nothing (Just ["stack build"]) (Just [ (RunConfig (Just "code") "stack exec" (Just [("HOST", "localhost"), ("PORT", "1234")]))])
+      [ Config ["src"] ["**/*.hs"] Nothing (Just ["stack build"]) (Just [ "stack exec" ])
       , Config ["client"] ["**/*.elm"] (Just ["Api.elm"]) (Just ["elm-make"]) Nothing]
diff --git a/trigger.cabal b/trigger.cabal
--- a/trigger.cabal
+++ b/trigger.cabal
@@ -1,5 +1,5 @@
 name:                trigger
-version:             1.0.1.0
+version:             1.0.2.0
 homepage:            https://github.com/rhyskeepence/trigger
 license:             BSD3
 license-file:        LICENSE
