Как запретить Cygwin XWin Server автоматически запускать xterm?

12

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

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

(Вопрос вдохновлен этот комментарий по Стейн Vanpoucke над на переполнение стека)

я и
источник

Ответы:

5

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

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

sleep inf

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

josmith42
источник
1
По некоторым причинам это не работает для меня. Я должен был напечатать: exec sleep infinityкак показано здесь: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit
enricoferrero
17

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

От man startxwin:

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

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

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

touch ~/.startxwinrc
я и
источник
1
Это решение было хорошо долгое время, но теперь с последним обновлением его нет. Использование пустых .startxwinrcрезультатов приводит к немедленному исчезновению X-сервера. :-(
Notinlist
1
@ Notinlist Так оно и есть. Это немного грустно. Я постараюсь исследовать и найти новое решение; похоже, что система сейчас несколько сложнее, и я не могу понять, как она должна работать…
me_and
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

SilversleevesX
источник
Это не совсем ответ на этот вопрос; с формулировкой это могло бы быть, но я думаю, что это было бы лучше подходит как отдельный вопрос и ответ (как я сделал здесь) об обработке ошибки, которую вы видите. Затем вы можете дать ссылку на этот вопрос в комментариях к этому.
me_and