ghci에 :quit
, :q
또는 CTRL+d
을 사용하는 경우 repl은 내가 알 수있는 한 신호를 높이 지 않고 종료됩니다.ghci에 대한 정리 처리기를 설치하는 방법 : quit?
이 경우 일부 클린업 코드를 어떻게 실행할 수 있습니까? 난 그 트릭을 할 것입니다 있는지 확인하기 위해 몇 가지 신호 처리기를 설치하려고했지만, ghci이 사용하게 것처럼이 표시되지 않습니다 : 내가 바라던 결과는 cleanup (..)
입니다
Prelude> import System.Posix.Signals
Prelude System.Posix.Signals> installHandler sigINT (Catch $ print "cleanup (via INT)") Nothing
Prelude System.Posix.Signals> installHandler sigTERM (Catch $ print "cleanup (via TERM)") Nothing
Prelude System.Posix.Signals> :quit
Leaving GHCi.
가에 인쇄중인 콘솔이 트리거되었음을 나타냅니다.
가 나는 :def
를 사용 :q
및 :quit
을 무시하는 것이 가능하다는 것을 알고 있지만,이 CTRL+d
인 REPL을 종료 내 선호하는 방법을 처리하지 않습니다.
이 질문에 대한 컨텍스트는 이것이다 : 내가 보호되지 않은 데이터베이스를 실행하는 서버에 터널을 ssh를하는 프로세스를 양산했습니다. 이 프로세스는 repl을 종료 할 때까지 지속되므로 매번 수동으로 프로세스를 강제 종료해야합니다.
import qualified System.Process as Process
forkSshTunnel = forkIO $ do
let sshProc = do
(_,_,_, phandle) <- Process.createProcess $
(Process.proc "ssh" [ {- ... -} ])
{ Process.std_in = Process.CreatePipe
, Process.std_out = Process.Inherit
, Process.std_err = Process.Inherit
}
return phandle
bracket sshProc _terminateSsh _waitForSsh
온 전성 체크 : 쉘에서'ssh my.fun.server ghci'를 실행하고 Ctrl + D를 누르면 나의 ssh 세션이 끝납니다. ssh가 이런 식으로 행동하지 않는다는 말입니까? –
또한'ssh'에 대한 인수를 생략 한 이유를 알았지 만,'_terminateSsh'와'_waitForSsh'에 대한 정의를 포함시켜야 완전한 질문을 할 수 있습니다. –
ssh를 통해 ghci에 연결하지 않았습니다. ssh 터널은 원격 데이터베이스에 연결하기위한 프로세스입니다.'[ "-N", sshUser ++ "@"++ sshRemoteHost, "-L", localDbPort ++ ": localhost :"++ sshRemoteDbPort]'. –