По состоянию на ноябрь 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 убивать его).