使用 GNU Emacs 23.2.1,我从两个不同的 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)
当我保持至少一个客户端运行时,我可以打开和关闭任意数量的其他客户端。
我的问题是:
- 其他人能看到这种行为吗?
- 有没有办法即使在最后一个客户端退出后仍保持套接字活动?
- 有没有好的方法检查套接字是否允许打开另一个客户端?
- 如果插座不再可用,为什么它还保留着?
编辑:似乎出现了段emacs --daemon
错误。我将其发布为错误 7149
答案1
其他人能看到这种行为吗?
是的,尽管我的工作风格不同。我在 .emacs 文件中使用了 (server-start),而不是使用命令行参数。
有没有办法即使在最后一个客户端退出后仍保持套接字活动?
你正在用吗CX#彻底关闭客户端缓冲区?
有没有办法即使在最后一个客户端退出后仍保持套接字活动?
我发现我必须Mx 服务器启动在已经运行了几天或更长时间的 Emacs 上。这并不是真正地让它保持运行,而是重新创建它。
如果插座不再可用,为什么它还保留着?
我相信这是一个错误。
答案2
我可以通过删除包含套接字的目录来解决这个问题。我运行了:
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