diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,8 +1,12 @@
 # Revision history for Z-IO
 
+## 0.6.4.0  -- 2020-02-20
+
+* Add `initProcess'` to kill process while finish using the process resource by default.
+
 ## 0.6.3.0  -- 2020-02-20
 
-* Split `Z.IO.UV.FFI` to `Z.IO.UV.FFI` and `Z.IO.UV.FFI_Env`, to make the module buildable when memory is constrained. 
+* Split `Z.IO.UV.FFI` to `Z.IO.UV.FFI` and `Z.IO.UV.FFI_Env`, to make the module buildable when memory is constrained.
 * Make functions works on TTY in `Z.IO.StdStream` correctly ignore redirected streams.
 * Move `pathSeparator` to `pathSeparators`, now `pathSeparator` return the default path separator.
 
diff --git a/Z-IO.cabal b/Z-IO.cabal
--- a/Z-IO.cabal
+++ b/Z-IO.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               Z-IO
-version:            0.6.3.0
+version:            0.6.4.0
 synopsis:           Simple and high performance IO toolkit for Haskell
 description:
   Simple and high performance IO toolkit for Haskell, including
diff --git a/Z/IO/Process.hsc b/Z/IO/Process.hsc
--- a/Z/IO/Process.hsc
+++ b/Z/IO/Process.hsc
@@ -19,8 +19,9 @@
 
 -}
 
-module Z.IO.Process (
-    initProcess
+module Z.IO.Process
+  ( initProcess
+  , initProcess'
   , readProcess
   , readProcessText
   , ProcessOptions(..)
@@ -130,14 +131,16 @@
 pattern SIGKILL = 9  -- on windows this is absent
 pattern SIGHUP  = #const SIGHUP
 
--- | Resource spawn processes.
+-- | Resourced spawn processes.
 --
--- Return a resource spawn processes, when initiated return the @(stdin, stdout, stderr, pstate)@ tuple,
--- std streams are created when pass 'ProcessCreate' option, otherwise will be 'Nothing',
--- @pstate@ will be updated to `ProcessExited` automatically when the process exits.
+-- Return a resource spawn processes, when initiated return the
+-- @(stdin, stdout, stderr, pstate)@ tuple, std streams are created when pass
+-- 'ProcessCreate' option, otherwise will be 'Nothing', @pstate@ will be updated
+-- to 'ProcessExited' automatically when the process exits.
 --
--- A cleanup thread will be started when you finish using the process resource, to close any std stream
--- created during spawn.
+-- When you finish using the process resource, a cleanup action will be called
+-- to wait process exit and close any std stream created during spawn. If you
+-- also need to kill the process, see 'initProcess'' instead.
 --
 -- @
 -- initProcess defaultProcessOptions{
@@ -148,12 +151,27 @@
 --   waitProcessExit pstate  -- wait for process exit on current thread.
 -- @
 initProcess :: ProcessOptions -> Resource (Maybe UVStream, Maybe UVStream, Maybe UVStream, TVar ProcessState)
-initProcess opt = initResource (spawn opt) $ \ (s0,s1,s2, pstate) -> void . forkIO $ do
-    _ <- waitProcessExit pstate
-    forM_ s0 closeUVStream
-    forM_ s1 closeUVStream
-    forM_ s2 closeUVStream
+initProcess opt = initResource (spawn opt) $
+    \ (s0,s1,s2, pstate) -> do
+        _ <- waitProcessExit pstate
+        forM_ s0 closeUVStream
+        forM_ s1 closeUVStream
+        forM_ s2 closeUVStream
 
+-- | Resourced spawn processes.
+--
+-- The same as 'initProcess', but the clean action will try to send 'SIGTERM'
+-- to the process first.
+initProcess' :: ProcessOptions -> Resource (Maybe UVStream, Maybe UVStream, Maybe UVStream, TVar ProcessState)
+initProcess' opt = initResource (spawn opt) $
+    \ (s0, s1, s2, pstate) -> do
+        m_pid <- getProcessPID pstate
+        maybe (return ()) (flip killPID SIGTERM) m_pid
+        _ <- waitProcessExit pstate
+        forM_ s0 closeUVStream
+        forM_ s1 closeUVStream
+        forM_ s2 closeUVStream
+
 -- | Spawn a processe with given input.
 --
 -- Child process's stdout and stderr output are collected, return with exit code.
@@ -188,7 +206,7 @@
     (out, err, e) <- readProcess opts (T.getUTF8Bytes inp)
     return (T.validate out, T.validate err, e)
 
--- | Spawn a new thread
+-- | Spawn a new process.
 --
 -- Please manually close child process's std stream(if any) after process exits.
 spawn :: HasCallStack => ProcessOptions -> IO (Maybe UVStream, Maybe UVStream, Maybe UVStream, TVar ProcessState)
