2

Happstack サーバー アプリケーションを作成していますが、アプリケーションの終了方法がわかりません。

私が持っている場合:

main = do
  printf "begin server"
  simpleHTTP nullConf myHomepage
  printf "end server"

問題なく実行でき、アプリケーション (Linux) を CTRL+C で強制終了できますが、最後の印刷は実行されません。Happstack を正常に終了するにはどうすればよいですか? アプリケーションを正しく終了しないとイベントログが生成されないことに気付き、気になります。

アップデート:

アプリケーションはトップメインでDyreを使用しています。

4

2 に答える 2

3

私は通常、別のスレッドでforkIO生成するために使用します。simpleHTTPそして、waitForTerminationを待ち^Cます。

module Main where

import Control.Concurrent (killThread, forkIO)
import Happstack.Server (nullConf, simpleHTTP, ok, toResponse)
import Happstack.State (waitForTermination)

main :: IO ()
main =
    do putStrLn "begin server"
       httpThreadId <- forkIO $ simpleHTTP nullConf (ok $ toResponse "This site rules!")
       waitForTermination
       killThread httpThreadId
       putStrLn "end server"

waitForTerminationhappstack-stateパッケージから来ています。複数の理由から、実際には別の場所に移動する必要があります。インストールしたくない場合はhappstack-state、ローカル コピーをコピーしてアプリに貼り付けることができます。

-- | Wait for a signal.
--   On unix, a signal is sigINT or sigTERM. 
waitForTermination :: IO ()
waitForTermination
    = do istty <- queryTerminal stdInput
         mv <- newEmptyMVar
         installHandler softwareTermination (CatchOnce (putMVar mv ())) Nothing
         case istty of
           True  -> do installHandler keyboardSignal (CatchOnce (putMVar mv ())) Nothing
                       return ()
           False -> return ()
         takeMVar mv
于 2011-09-06T00:10:58.833 に答える
0

simpleHTTPを使用して別のスレッドで (IO アクションである) を実行し、forkIOメイン メソッドでいつでも終了できます。

次のようなものを試してください:

main = do
    printf "begin server"
    threadID <- forkIO $ simpleHTTP nullConf myHomepage
    c <- getChar
    printf "Quiting"
于 2011-09-05T10:03:53.033 に答える