С GNU Emacs 23.2.1, который я установил из источников в 2 разных дистрибутивах GNU/Linux (CentOS 4.x и Ubuntu Hardy - оба с KDE 3.x)

Я делаю:

$ emacs --daemon
("emacs")
Starting Emacs daemon.
$ emacsclient -c
Waiting for Emacs...

Emacs запускается как положено. Затем я закрываю клиента. fuser /tmp/emacs${UID}/server указывает, что сокет активен и процесс emacs --daemon запущен.

$ emacsclient -c
Waiting for Emacs...

Emacs не запускается. fuser /tmp/emacs${UID}/server указывает, что сокет устарел, а процесс emacs --daemon больше не существует. Так что:

$ emacsclient -c
emacsclient: connect: Connection refused
emacsclient: No socket or alternate editor.  Please use:

        --socket-name
        --server-file      (or environment variable EMACS_SERVER_FILE)
        --alternate-editor (or environment variable ALTERNATE_EDITOR)

Когда у меня работает хотя бы один клиент, я могу открывать и закрывать столько клиентов, сколько захочу.

Итак, мои вопросы:

  1. Кто-нибудь еще может увидеть это поведение?
  2. Есть ли способ сохранить сокет живым даже после выхода последнего клиента?
  3. Есть хороший способ проверить, позволит ли сокет открыть другой клиент?
  4. Почему сокет остается, если его больше нельзя использовать?

Редактировать: Кажется, что emacs --daemon segfaults. Я выложил как баг 7149

2 ответа2

1

Кто-нибудь еще может увидеть это поведение?

Да, хотя мой стиль работы отличается. У меня есть (server-start) в моем файле .emacs вместо использования аргументов командной строки.

Есть ли способ сохранить сокет живым даже после выхода последнего клиента?

Используете ли вы Cx # для чистого закрытия клиентских буферов?

Есть ли способ сохранить сокет живым даже после выхода последнего клиента?

Я обнаружил, что мне нужно запустить Mx server на Emacs, который работал уже несколько дней или дольше. Это не точно поддерживает это, но восстанавливает это.

Почему сокет остается, если его больше нельзя использовать?

Я считаю, что это ошибка.

0

Я смог преодолеть эту проблему, удалив каталог, содержащий сокет. Я побежал:

strace emacsclient -c

и увидел эти строки:

stat("/tmp/emacs1000/server", {st_mode=S_IFSOCK|0700, st_size=0, ...}) = 0
connect(3, {sa_family=AF_FILE, path="/tmp/emacs1000/server"}, 23) = -1 ECONNREFUSED (Connection refused)

которые показывают каталог, в котором находится файл сокета, тогда все, что мне нужно было сделать, это удалить этот каталог:

rm -rf /tmp/emacs1000

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .