Od listopada 2014 r. Najnowsze wersje startxwinużywają xinitdo uruchomienia serwera Cygwin / X, który jest tak naprawdę nazywany XWin.exe. Proces przebiega mniej więcej tak:
- Ty dzwonisz
startxwin
startxwintworzy nowy .Xauthorityplik i jeden o nazwie .serverauth.1234(gdzie 1234zmienia się przy każdym uruchomieniu X)
startxwin ustawia niektóre parametry klienta i serwera
startxwinwywołania xinitz parametrami klienta i serwera, w tym niektóre opcjonalne skrypty powłoki i odniesienie do pliku auth.
xinit uruchamia serwer X, uruchamiając niektóre skrypty rc
xinituruchamia xtermskrypt klienta (zwykle ) lub klienta rc. Chcemy tego uniknąć
- Po zamknięciu klienta lub zakończeniu skryptu rc klienta
xinitwyłącza serwer X. Jeśli unikniemy kroku 6, musimy również tego uniknąć
Możliwe jest uruchamianie XWin.exebezpośrednio z poziomu powłoki logowania Bash, bez otaczających zadań, które startxwini xinitwykonują. Główną zaletą tego jest to, że zachowuje się tak, jak chcemy: serwer X uruchamia się i pozostaje uruchomiony. Niestety, ponieważ .Xauthoritypodczas uruchamiania nie przekazano żadnego pliku, twój serwer X pozwoliłby na połączenie się z dowolnym procesem lokalnym, co jest niepewne.
Na szczęście to xinitrobi większość rzeczy, których nie chcemy. Istnieje szybki hack, który omija, xinitale zachowuje pozostałe elementy startxwinzwiązane z samym serwerem.
TL; DR: W startxwindolnej linii znajduje się wiersz o treści:
eval xinit \"$client\" $clientargs -- \"$server\" $display $serverargs
Zmień tę linię na:
eval \"$server\" $display $serverargs
Od tej pory startxwinskrypt będzie dzwonił XWin.exebezpośrednio, a nie dzwoni xinit. Oczywiście spowoduje to wyłączenie skryptów rc klienta, ale nie chcieliśmy ich w ogóle. Oznacza to również, że X będzie kontynuował działanie bez potrzeby korzystania z procesu klienta, aby utrzymać go przy życiu (tj. Nie xinitzabijać go).
exec sleep infinityjak pokazano tutaj: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit