2016-07-17 2 views
1

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 
+0

온 전성 체크 : 쉘에서'ssh my.fun.server ghci'를 실행하고 Ctrl + D를 누르면 나의 ssh 세션이 끝납니다. ssh가 이런 식으로 행동하지 않는다는 말입니까? –

+0

또한'ssh'에 대한 인수를 생략 한 이유를 알았지 만,'_terminateSsh'와'_waitForSsh'에 대한 정의를 포함시켜야 완전한 질문을 할 수 있습니다. –

+0

ssh를 통해 ghci에 연결하지 않았습니다. ssh 터널은 원격 데이터베이스에 연결하기위한 프로세스입니다.'[ "-N", sshUser ++ "@"++ sshRemoteHost, "-L", localDbPort ++ ": localhost :"++ sshRemoteDbPort]'. –

답변

1

설명서를 검토 한 결과,이 방법을 사용할 수 없다고 생각합니다. 이 기능을 구현하려면 ghci 코드로 직접 들어가는 것이 좋습니다.

+0

Daniel의 도움에 감사드립니다. 적어도 티켓을 만드는 방법에 대해 알아 보겠습니다. –

관련 문제