我在Haskell中编写了一个systemd socket激活服务.这个想法是服务应该在消息发送到其套接字时自动启动,服务应该处理在套接字上等待的所有消息,然后退出.
注意:处理所有等待消息后服务应该关闭的原因(而不是永远运行)是套接字激活之间应该有几个小时或几天.
部署-trigger.socket:
[Socket]
ListenStream=/var/run/deploy-trigger.socket
[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)
部署-trigger.service:
[Service]
ExecStart=/home/user4301448/.local/bin/deploy-trigger-exe
StartLimitInterval=0
Run Code Online (Sandbox Code Playgroud)
Main.hs
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad (forever)
import qualified Data.ByteString.Char8 as BS (putStrLn)
import Data.Foldable (foldl')
import Network.Socket (withSocketsDo, accept, close, SockAddr(SockAddrUnix), Socket)
import Network.Socket.ByteString (recv)
import Network.Socket.Activation (getActivatedSockets)
import System.Exit (exitWith, ExitCode(..))
main :: IO ()
main = withSocketsDo $ forever $ getActivatedSockets >>= processSocks
processSocks :: Maybe [Socket] -> IO ()
processSocks (Just socks) = do
putStrLn "Got socket(s)."
traverse_ (\sock -> …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读Gabriel Gonzale关于Free Monads的出色博客文章。为了帮助我理解,我想为以下类型创建Show实例并在GHCi中对其进行处理,该类型(来自博客文章)为:
data Thread m r = Atomic (m (Thread m r)) | Return r
Run Code Online (Sandbox Code Playgroud)
我的Show实例是:
instance (Show m, Show r) => Show (Thread m r) where
show (Atomic m x) = "Atomic " ++ show m ++ " " ++ show x
show (Return x) = "Return " ++ show x
Run Code Online (Sandbox Code Playgroud)
不幸的是,当尝试加载文件时,GHCi给了我这个错误:
• Expected kind ‘* -> *’, but ‘m’ has kind ‘*’
• In the first argument of ‘Thread’, namely ‘m’
In the first …
Run Code Online (Sandbox Code Playgroud) 在用于从密钥环获取密码的Turtle脚本中,ssh-add
使用这些密码调用以便不必手动填写它们,具有以下功能:
processKey :: (T.Text, T.Text) -> Shell Line -> IO ()
processKey (kn, str) pwds = do
-- Not sure why (text str) is needed here, but it won't typecheck without
-- it (despite OverloadedStrings).
let expectArg = do
ml <- grep (contains (text str)) pwds
let pass = getPwd $ cut tab (format l ml)
return $ T.unlines [ "<< EOF"
, "spawn ssh-add"
, "expect \"Enter passphrase\""
, "send " <> pass
, "expect eof"
, …
Run Code Online (Sandbox Code Playgroud)