12

Всякий раз, когда я запускаю X-сервер Cygwin с помощью ссылки "XWin Server" в моем меню "Пуск" или при запуске startxwin из оболочки Cygwin, автоматически появляется окно xterm, которое мне ни нужно, ни нужно.

Как мне избежать этого?

(Вопрос, вдохновленный этим комментарием Stijn Vanpoucke на Stack Overflow)

4 ответа4

17

ОБНОВЛЕНИЕ: Этот ответ устарел. Для получения актуального ответа см . Ответ пользователя 551570 ниже.

От man startxwin:

Если в командной строке не указана конкретная клиентская программа, startxwin будет искать файл в домашнем каталоге пользователя с именем .startxwinrc для запуска в качестве сценария оболочки для запуска клиентских программ. Если такого файла не существует, startxwin будет использовать следующее по умолчанию:

xterm  -geometry  +1+1  -n  login  -display  :0

Таким образом, чтобы избежать запуска какой-либо программы при запуске X-сервера, вам нужен пустой файл .startxwinrc . Просто запустите следующую команду Cygwin:

touch ~/.startxwinrc
5

Кажется, что поведение startxwin изменилось с тех пор, как @me_and первоначально ответил на вопрос, поэтому простое создание пустого .startxwinrc в вашем домашнем каталоге больше не будет работать.

Я нашел ответ здесь. По сути, при выходе из последней команды в .startxwinrc сервер завершает работу. Если вы хотите предотвратить это, вы можете поместить это в качестве последней строки в вашем .startxwinrc:

sleep inf

Это не запустит никаких клиентских программ, но также предотвратит выход .startxwinrc.

3

По состоянию на ноябрь 2014 года последние версии startxwin используют xinit для запуска сервера Cygwin/X, который на самом деле называется XWin.exe . Процесс идет примерно так:

  1. Вы звоните startxwin
  2. startxwin создает новый .Xauthority и один .serverauth.1234 (где 1234 меняется каждый раз, когда вы запускаете X)
  3. startxwin устанавливает некоторые параметры клиента и сервера
  4. startxwin вызывает xinit с параметрами клиента и сервера, включая некоторые необязательные сценарии оболочки и ссылку на файл аутентификации.
  5. xinit запускает X-сервер и запускает некоторые из сценариев rc
  6. xinit запускает клиентский (обычно xterm) или клиентский скрипт rc. Мы хотим избежать этого
  7. Когда вы закрываете клиент или клиентский сценарий rc завершает свою работу, xinit завершает работу X-сервера. Если мы избегаем шаг 6, нам также нужно избегать этого

Можно запустить XWin.exe непосредственно из оболочки входа в систему Bash, без окружающих задач, которые startxwin и xinit . Основным преимуществом этого является то, что он ведет себя так, как мы хотим: X-сервер запускается и продолжает работать. К сожалению, так как нет .Xauthority переданный во время запуска, ваш X-сервер разрешит подключаться к нему любому локальному процессу, что небезопасно.

К счастью, именно xinit делает большинство вещей, которые мы не хотим. Есть быстрый взлом, который обходит xinit но сохраняет остальные элементы startxwin , которые связаны с самим сервером.

TL; DR: в startxwin есть строка внизу, которая гласит:

eval xinit \"$client\" $clientargs -- \"$server\" $display $serverargs

Измените эту строку на:

eval \"$server\" $display $serverargs

Отныне скрипт startxwin будет вызывать XWin.exe напрямую, а не вызывать xinit . Очевидно, это отключит любые клиентские сценарии rc, но мы не хотели, чтобы они были в первую очередь. Это также означает, что X будет продолжать работать без необходимости клиентского процесса, чтобы поддерживать его (т.е. не xinit убивать его).

0

Я сделал привычку запускать Cygwin X с помощью startxwin(.exe). Мой файл .startxwinrc выглядит следующим образом:

X :0 -rootless mrxvt  -geometry  +1+1  -n  login  -display  :0 -tt ImTabbed

Пока это работает. Единственная ошибка, которую я получаю, касается отображения, все еще "открытого" другим X-процессом. Эта ошибка указывает определенный файл, который X-сервер генерирует по умолчанию для каждого сеанса. Люди Cygwin знают, что он не удаляется после завершения сеанса.

Поэтому я написал псевдоним, чтобы "вылечить", что:

alias freex='rm /tmp/.X0-lock'

Я помещаю ту же самую строку - часть между кавычками, во всяком случае - в мои файлы .bashrc и .bash_profile на случай, если я забуду сделать это сам.

НТН.

BZT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .