Emacs 데몬으로 실행하기

최근 이맥스(Emacs)를 쓰는 재미에 푹 빠졌다. 가지고 노느라 시간이 후딱 지나간다. 터미널에서 보다는 이쁜 GUI 이맥스를 주로 쓰는데, 한가지 아쉬운 점이 있다. 패키지를 주렁주렁 매달아 놔서 인지 이맥스 실행 시간이 좀 늦다. 그래서 메뉴얼을 보다가 이맥스 서버로 쓰기를 발견했다. 오! 요거다 싶어서 이거 저거 해보고, 하는 김에 Kazam으로 스크린캐스트도 만들어 봤다.

Emacs – Normal vs Daemon

데몬 시작하기

emacs --daemon

emacs –daemon으로 이맥스 데몬을 시작 할 수 있다.

클라이언트 열기

emacsclient -t
emacsclient -c -n

이맥스 클라이언트는 emacs가 아니고 emacsclient을 사용해야 한다.

터미널은 위와 같이 -t 플래그를 사용하고, GUI로 열때는 -c 플래그를 사용한다. 그리고 조금 더 빠른 실행을 위해 서버에서 오는 리턴을 안 기다리게 하는 -n 플래그를 쓸 수 있다. 명령문이 조금 길기 때문에 쉘의 alias를 사용하면 편하다. .bashrc 또는 .zshrc에 다음을 추가해 두자

alias e="emacsclient -t"
alias ec="emacsclient -c -n"

이제 e는 터미널에서 이맥스 클라이언트를 열것이고 ec는 GUI 클라이언트를 열어준다.
클라이언트는 말 그대로 클라이언트다. 클라이언트 여러 개를 열어도 서버의 내용이 공유된다. 심심하면 클라이언트 두개를 열어보자. 두 클라이언트에서 모두 *scratch* 버퍼를 열고, 한 클라이언트에서 *scratch* 버퍼에 “안녕!”을 입력해 보라. 다른 클라이언트에 동일하게 “안녕!”이 써지는게 보일것이다. 이런거다. 그래서 편집 중인 내용을 저장하지 않고, 클라이언트를 닫아도 다시 클라이언트를 열면 그 내용이 살아있게 된다. 오!
여기서 문제가 생긴다. 파일에 저장하지 않고 편집 중인 버퍼가 있는데, 사용 중인 클라이언트가 없을 수 있다. 이때 만일 컴퓨터를 끄면 어떻게 될까? 그렇다. 편집 중인 내용이 날아가버린다. 그래서 서버(데몬)를 죽일 때는 아름답게(graceful)하게 죽여줘야 한다.

데몬 죽이기

데몬을 kill 명령으로 죽일 수도 있다. killall emacs 하면 모든 이맥스를 다 죽여준다. 문제는 이러면 위에서 설명한 것처럼 뭔가 아름답지 못하다. 그래서 조금 예쁘게 죽여야 하는데, 클라이언트가 실행 중이고, 서버와 같이 동반 자살(?)을 하려면 C-x C-c로 끝내지 말고 M-x kill-emacs를 해야한다. C-x C-csave-buffers-kill-terminal을 호출하는데, 클라이언트는 그냥 자기만 죽는다. 대신에 kill-emacs를 호출해야 서버와 같이 사라진다. 실행중인 클라이언트가 없으면, emacsclient -e '(kill-emacs)'를 실행하면 서버가 아름답게 죽는다.
그렇다면 편집중인 파일들은 어떻게 될까? kill-emacs 명령이 똑똑하게 알아서 잘 임시 파일로 저장해 둔다. 나중에 동일한 파일을 열면 복구하라고 친절하게 메시지도 던져 준다.
클라이언트가 하나도 없으면 이맥스가 서버로 실행 중인지를 몰라서, 그냥 컴퓨터를 종료 시키면 어떻하나? X를 쓰고 있다면 X의 세션 종료 스크립트에 이맥스 서버를 죽여달라고 넣거나, init.d 스크립트를 만들고 종료와 재부팅 Run Level인 rc0.d과 rc6.d에 Kill 스크립트 링크를 걸어 주면 된다. 심플한 이맥스 종료 스크립트를 소개한다.

#!/bin/bash
USER=`id | sed 's/uid=[0-9][0-9]*(\([^)]*\)).*/\1/'`
USERID=`id -u $USER`

if test -e /tmp/emacs$USERID/server
then
emacsclient -e '(kill-emacs)'
fi

간단하게 서버가 있는지를 확인하고 사살하는 스크립트다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다