Emacs客户端/服务器和ClearCase视图

时间:2010-08-26 13:09:59

标签: unix emacs client-server clearcase environment

所以我厌倦了等待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调用脚本第一次运行。因此:

  • 对于版本1:只有一个守护程序,但Emacs客户端无法在/vobs/下看到mvfs挂载。
  • 对于版本2:有几个守护进程都使用相同的$ {server}套接字。

因此,我的问题是:使用版本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并使用不同的环境变量,但无济于事。

2 个答案:

答案 0 :(得分:3)

真的,但是我会避免使用setview

  • 正如您所指出的,它会创建一个shell(在与守护进程通信方面存在所有问题)
  • 一次只能查看一个视图。您始终需要执行cleartool pwv以确保在使用/vobs路径时您当前在哪个视图中工作。

我更喜欢使用动态视图的完整路径:

/view/myView/vobs/...

这样,没有产生shell,没有消歧,没有麻烦。

答案 1 :(得分:0)

好的,部分神秘事项已经解决了:

不应使用版本2。它似乎有效,因为:

  1. /sbin/fuser -k ${server}实际上并未终止服务器进程。也许/sbin/fuser -k -SIGKILL ${server}会,但我没有尝试过。它也可能是由于ClearCase的视图魔法(在内核级别通过操作使用)。
  2. rm -f ${server}取消链接文件,但不释放套接字,因为它仍然被正在运行的进程使用。
  3. 因此,第一次运行调用脚本的最后一个视图将是$ {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 "$@"