所以我厌倦了等待Emacs每次重新加载,并咨询Emacs Wiki,我写了一个调用脚本,如:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 1
server=/tmp/emacs${UID}/server
if [ ! -S ${server} ] ; then
/opt/emacs/bin/emacs --daemon
until [ -S ${server} ] ; do
sleep 1s
done
fi
/opt/emacs/bin/emacsclient -c "$@"
然而,由于过时的套接字导致它失败(由于无关的原因我的emacs --daemon
意外被杀):所以我写道:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 2
server=/tmp/emacs${UID}/server
if ! /sbin/fuser ${server} 2> /dev/null ; then
/sbin/funser -k ${server}
rm -f ${server}
fi
if [ ! -S ${server} ] ; then
/opt/emacs/bin/emacs --daemon
until [ -S ${server} ] ; do
sleep 1s
done
fi
/opt/emacs/bin/emacsclient -c "$@"
这很有效,但是在使用ClearCase视图时,我发现了一个皱纹:
在Unix中使用ClearCase命令:
cleartool setview myview-myuser
创建一个子shell,它具有修改过的文件系统层次结构:/vobs/
下的几个使用mvfs的新安装,只对该shell可见。
对于每个这样的新shell,命令/sbin/fuser ${server}
返回1(错误),这是我的Emacs调用脚本第一次运行。因此:
/vobs/
下看到mvfs挂载。因此,我的问题是:使用版本2可以吗?如果是,如果所有守护进程显然使用相同的${server}
套接字,它怎么能工作?如果不是,我该怎么做才能解决这个问题?
进度:
所以我得到了一个问题的答案(见下面的答案),现在我被困了 如何解决?部分:
我正在考虑将${server}
置于/vobs/
之下,因此让ClearCase本身解决了我的问题。我只需要弄清楚Emacs是否以及如何让我这样做:
根据我的/opt/emacs/share/emacs/23.2/lisp/server.el
server-socket-dir
根据环境变量${TMPDIR}
的值,所以我尝试了:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 3
[ "${CCVIEW}" ] && TMPDIR="/vbos/misc/tmp" || TMPDIR="/tmp"
export TMPDIR
function is_server_up() {
local server=${TMPDIR}/emacs${UID}/server
[ -e ${mysock} ] && /sbin/fuser ${server}
}
if ! is_server_up ; then
/opt/emacs/bin/emacs --daemon
until is_server_up ; do
sleep 1s
echo "DEBUG: sleeping"
done
fi
/opt/emacs/bin/emacsclient -c "$@"
但是在运行ClearCase视图时,我看到了:
Loading ~/.emacs.d/this-module.el (source)...
Loading ~/.emacs.d/this-module.el (source)...done
Loading ~/.emacs.d/that-module.el (source)...
Loading ~/.emacs.d/that-module.el (source)...done
... snip ...
Starting Emacs daemon.
ESC [ A
ESC
ESC [
ESC [ a
M-[ A is undefined
......它永远不会退出。
我也尝试修补server.el
并使用不同的环境变量,但无济于事。
答案 0 :(得分:3)
真的,但是我会避免使用setview
。
cleartool pwv
以确保在使用/vobs
路径时您当前在哪个视图中工作。我更喜欢使用动态视图的完整路径:
/view/myView/vobs/...
这样,没有产生shell,没有消歧,没有麻烦。
答案 1 :(得分:0)
好的,部分神秘事项已经解决了:
不应使用版本2。它似乎有效,因为:
/sbin/fuser -k ${server}
实际上并未终止服务器进程。也许/sbin/fuser -k -SIGKILL ${server}
会,但我没有尝试过。它也可能是由于ClearCase的视图魔法(在内核级别通过操作使用)。rm -f ${server}
取消链接文件,但不释放套接字,因为它仍然被正在运行的进程使用。因此,第一次运行调用脚本的最后一个视图将是$ {server}套接字文件的所有者,随后Emacs的调用将使用该套接字,并将看到该视图的版本文件。 / p>
想象一下有趣的调试时间......
至于如何修复它?部分,我将采取懦弱的方式,并在ClearCase视图中恢复独立Emacs:
#!/bin/bash
# @file: /usr/local/bin/emacs
# @version: 4
if [ "${CCVIEW}" ] ; then
/opt/emacs/bin/emacs $@
exit $?
fi
function is_server_up() {
local server=/tmp/emacs${UID}/server
[ -e ${mysock} ] && /sbin/fuser ${server}
}
if ! is_server_up ; then
/opt/emacs/bin/emacs --daemon
until is_server_up ; do
sleep 1s
done
fi
/opt/emacs/bin/emacsclient -c "$@"