По состоянию на ноябрь 2014 года последние версии startxwinиспользуются xinitдля запуска сервера Cygwin / X, который фактически называется XWin.exe. Процесс идет примерно так:
- Ты звонишь
startxwin
startxwinсоздает новый .Xauthorityфайл и один называется .serverauth.1234(где 1234меняется каждый раз, когда вы запускаете X)
startxwin устанавливает некоторые параметры клиента и сервера
startxwinвызовы xinitс параметрами клиента и сервера, включая некоторые необязательные сценарии оболочки и ссылку на файл аутентификации.
xinit запускает X-сервер, запускает некоторые из сценариев rc
xinitзапускает клиентский (обычно xterm) или клиентский скрипт rc. Мы хотим избежать этого
- Когда вы закрываете клиент или клиентский скрипт 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убивать).
exec sleep infinityкак показано здесь: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit