Клиент / сервер Emacs и представления ClearCase - PullRequest
1 голос
/ 26 августа 2010

Так что я устал от ожидания загрузки 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}?Если нет, что я должен сделать, чтобы это исправить?


Прогресс:

Итак, я получил ответ (см. Ответы ниже) на частьвопрос, и теперь я застрял с как это исправить? part:

Я собираюсь поставить ${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 ]

3 голосов
/ 26 августа 2010

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

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

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

/view/myView/vobs/...

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

0 голосов
/ 26 августа 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 "$@"
...