Клиент/сервер Emacs и представления ClearCase

Так что я устал ждать, пока 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

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

Для каждой такой новой оболочки команда /sbin/fuser ${server} возвращает 1 (ошибка) при первом запуске моего сценария вызова Emacs. Таким образом:

  • Для версии 1: есть только один демон, но клиенты Emacs не могут видеть монтирование mvfs под /vobs/.
  • Для версии 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 и использовать другую переменную среды, но безрезультатно.


person Chen Levy    schedule 26.08.2010    source источник


Ответы (2)


Просто примечание, но я бы не стал использовать setview.

  • Как вы заметили, он создает оболочку (со всеми ее проблемами с точки зрения связи с демонами)
  • Это только для одного просмотра за раз. Вам всегда нужно делать cleartool pwv, чтобы убедиться, в каком представлении вы сейчас работаете при использовании пути /vobs.

Я предпочитаю использовать полный путь динамического представления:

/view/myView/vobs/...

Таким образом, без спавн-шелла, без устранения неоднозначности, без проблем.

person VonC    schedule 26.08.2010
comment
Я поддерживаю предложение использовать полный путь, я очень успешно использовал его в течение многих лет. Даже создал несколько вспомогательных скриптов для легкого переключения между представлениями... - person Trey Jackson; 27.08.2010

Хорошо, часть загадки раскрыта:

Не следует использовать версию 2. Кажется, это работает, потому что:

  1. /sbin/fuser -k ${server} на самом деле не убивает серверный процесс. Возможно, /sbin/fuser -k -SIGKILL ${server} будет, но я этого не пробовал. Это также может быть связано с магией представления ClearCase (используемой для манипуляций на уровне ядра).
  2. rm -f ${server} отменяет связь с файлом, но не освобождает сокет, поскольку он все еще используется запущенными процессами.

Таким образом, последнее представление, запускающее сценарий вызова в первый раз, будет владельцем файла сокета ${server}, и последующие вызовы Emacs будут использовать этот сокет и будут видеть файлы версии этого представления.

Только представьте себе часы удовольствия от отладки этого...


Что касается части как это исправить?, я выберу трусливый выход и просто вернусь к автономному Emacs в представлениях ClearCase:

#!/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 "$@"
person Chen Levy    schedule 26.08.2010