Jak zapobiec automatycznemu uruchamianiu Xterm przez Cygwin's XWin Server?

12

Za każdym razem, gdy uruchamiam serwer X Cygwin za pomocą linku „Serwer XWin” w moim menu Start lub uruchamiając się startxwinz powłoki Cygwin, automatycznie pojawia się okno Xterm, którego nie chcę ani nie potrzebuję.

Jak tego uniknąć?

(Pytanie zainspirowany tym komentarzem przez Stijn Vanpoucke Powyżej na przepełnienie stosu)

ja i
źródło

Odpowiedzi:

5

Wygląda na to, że zachowanie startxwin zmieniło się od czasu @me_i pierwotnie odpowiedział na pytanie, więc po prostu utworzenie pustego pliku .startxwinrc w katalogu domowym nie będzie już działać.

Znalazłem odpowiedź tutaj . W istocie, gdy ostatnie polecenie w .startxwinrc zakończy działanie, serwer zakończy działanie. Jeśli chcesz temu zapobiec, możesz wstawić to jako ostatni wiersz w swoim pliku .startxwinrc:

sleep inf

To nie uruchomi żadnych programów klienckich, ale także uniemożliwi wyjście .startxwinrc.

josmith42
źródło
1
Z jakiegoś powodu to nie działa dla mnie. Musiałem wpisać: exec sleep infinityjak pokazano tutaj: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit
enricoferrero
17

AKTUALIZACJA : Ta odpowiedź jest teraz nieaktualna. Aby uzyskać aktualną odpowiedź, zobacz odpowiedź user551570 poniżej .

Od man startxwin:

Jeśli w wierszu poleceń nie podano żadnego konkretnego programu klienckiego, startxwinposzuka pliku w katalogu osobistym użytkownika, który ma .startxwinrczostać uruchomiony jako skrypt powłoki w celu uruchomienia programów klienckich. Jeśli taki plik nie istnieje, startxwinużyje domyślnie:

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

Dlatego, aby uniknąć uruchamiania jakiegokolwiek programu podczas uruchamiania serwera X, potrzebujesz pustego .startxwinrcpliku. Po prostu uruchom następujące polecenie Cygwin:

touch ~/.startxwinrc
ja i
źródło
1
To rozwiązanie było dobre przez długi czas, ale teraz przy ostatniej aktualizacji nie jest. Użycie pustego .startxwinrcpowoduje natychmiastowe zniknięcie serwera X. :-(
Notinlist
1
@Notinlist Tak się dzieje. To trochę smutne. Spróbuję zbadać i znaleźć nowe rozwiązanie; wygląda na to, że system jest teraz trochę bardziej skomplikowany i nie mogę w trywialny sposób ustalić, jak powinien działać…
Me_and
3

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:

  1. Ty dzwonisz startxwin
  2. startxwintworzy nowy .Xauthorityplik i jeden o nazwie .serverauth.1234(gdzie 1234zmienia się przy każdym uruchomieniu X)
  3. startxwin ustawia niektóre parametry klienta i serwera
  4. startxwinwywołania xinitz parametrami klienta i serwera, w tym niektóre opcjonalne skrypty powłoki i odniesienie do pliku auth.
  5. xinit uruchamia serwer X, uruchamiając niektóre skrypty rc
  6. xinituruchamia xtermskrypt klienta (zwykle ) lub klienta rc. Chcemy tego uniknąć
  7. 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).

Ethan T.
źródło
0

Przyzwyczaiłem się uruchamiać Cygwin X za pomocą startxwin (.exe). Mój plik .startxwinrc ma następujące brzmienie:

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

Do tej pory działało. Jedyny błąd, jaki dostaję, dotyczy tego, że ekran jest nadal „otwarty” przez inny proces X. Ten błąd określa określony plik, który serwer X generuje domyślnie dla każdej sesji. Ludzie z Cygwin są świadomi, że nie zostaną usunięte po zakończeniu sesji.

Więc napisałem alias, aby „wyleczyć”, że:

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

Umieszczam ten sam wiersz - w każdym razie część między cudzysłowami - w moich plikach .bashrc i .bash_profile, na wypadek, gdybym zapomniał zrobić to sam.

HTH.

BZT

SilversleevesX
źródło
To nie jest tak naprawdę odpowiedź na to pytanie; z przeformułowaniem może być, ale myślę, że lepiej byłoby, gdyby to było osobne pytanie i odpowiedź (tak jak tutaj) na temat obsługi błędu, który widzisz. Następnie możesz zamieścić link do tego pytania w komentarzach do tego pytania.
me_i