robin-0.1.0.0: src/PidFile.hs
module PidFile where
import Control.Lens
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.Trans.Resource
import System.Directory
import System.Posix.Process
import System.Posix.Types
import Types
import Util
readPidFile :: (MonadIO m, MonadReader Env m) => m (Maybe CPid)
readPidFile = do
view envPidFile
>>= \fp -> liftIO (doesFileExist fp)
>>= \ex -> case ex of
False -> return Nothing
True -> liftIO (readFile fp) >>= return . readMaybe
requirePidFile :: (MonadIO m, MonadReader Env m, MonadError Err m) => m CPid
requirePidFile = readPidFile >>= maybe (throwError Err) return
writePidFile :: (MonadIO m, MonadReader Env m, MonadResource m) => m ()
writePidFile = do
fp <- view envPidFile
pid <- liftIO getProcessID
_ <- allocate (writeFile fp $ show pid) (const $ removeFile fp)
return ()