The daemons package


Control.Pipe.C3 provides simple RPC-like wrappers for pipes.

Control.Pipe.Serialize provides serialization and incremental deserialization pipes.

Control.Pipe.Socket provides functions to setup pipes around sockets.

System.Daemon provides a high-level interface to starting daemonized programs that are controlled through sockets.

System.Posix.Daemon provides a low-level interface to starting, and controlling detached jobs.

See the file and the homepage for details.

[Skip to ReadMe]


Versions0.1.0, 0.1.1, 0.1.2, 0.2.0, 0.2.1, 0.2.1
Dependenciesbase (==4.*), bytestring, cereal (>=0.4.0), containers, daemons, data-default, directory, filepath, ghc-prim, network, pipes (>=4.0.0), transformers, unix [details]
AuthorAlexandru Scvortov <>
CategorySystem, Control, Network
Home page
Source repositoryhead: git clone git://
Executablesname, queue, addone, memo
UploadedThu Oct 3 18:47:08 UTC 2013 by AlexandruScvortov




Maintainers' corner

For package maintainers and hackage trustees

Readme for daemons-0.2.1


Daemons in Haskell made fun and easy


Here's AddOne, a simple daemon that waits for a number and responds with the incremented number.

import Data.Default ( def )
import System.Environment ( getArgs )
import System.Daemon

addOne :: Int -> IO Int
addOne n = return (n + 1)

main :: IO ()
main = do
    ensureDaemonRunning "addOne" def addOne
    [n] <- getArgs
    res <- runClient "localhost" 5000 ((read n) :: Int)
    print (res :: Maybe Int)

Running it, we see:

% addone 22
Daemon started on port 5000
Just 23
% addone 41
Just 42

The two important functions above are ensureDaemonRunning, which checks if a daemon named addOne is already running, and starts it if not, and runClient which connects to the daemon running on localhost:5000, passes it a number, and waits for the response.

What would I use this for?

Tutorials and examples


This package is on Hackage. To install it, run:

cabal update
cabal install daemons


See also