Як запобігти автоматичному запуску сервера XWin Cygwin?


12

Щоразу, коли я запускаю X-сервер Cygwin за допомогою посилання "Сервер XWin" у меню "Пуск" або запускаючи startxwinз оболонки Cygwin, я автоматично отримую вікно xterm, яке мені ні хочеться, ні потрібно.

Як я цього уникаю?

(Питання натхненний цей коментар по Стейн Vanpoucke над на переповнення стека)

Відповіді:


5

Здається, що поведінка startxwin змінилася з моменту, коли @me_and спочатку відповів на питання, тому просто створити порожній .startxwinrc у вашому домашньому каталозі більше не працюватиме.

Я знайшов відповідь тут . По суті, коли остання команда в .startxwinrc закінчується, сервер вийде. Якщо ви хочете запобігти цьому, ви можете помістити це як останній рядок у свій .startxwinrc:

sleep inf

Це не запустить жодної клієнтської програми, але також не дозволить .startxwinrc вийти.


1
Чомусь це не працює для мене. Мені довелося набрати: exec sleep infinityяк показано тут: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit
enricoferrero

17

ОНОВЛЕННЯ : Ця відповідь застаріла. Для отримання актуальної відповіді дивіться відповідь user551570 нижче .

Від 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_і

3

Станом на листопад 2014 року , новітні версії startxwinвикористовуються xinitдля запуску сервера Cygwin / X, який насправді називається XWin.exe. Процес відбувається приблизно так:

  1. Ти телефонуєш startxwin
  2. startxwinстворює новий .Xauthorityфайл і той, що називається .serverauth.1234(де 1234змінюється щоразу, коли ви запускаєте X)
  3. startxwin встановлює деякі параметри клієнта та сервера
  4. startxwinдзвінки xinitз параметрами клієнта та сервера, включаючи деякі необов’язкові сценарії оболонки та посилання на файл auth.
  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, якщо я забуду це зробити самостійно.

HTH.

BZT


Це насправді не відповідь на це питання; з переформулюванням це може бути, але я думаю, що це було б краще підходити як окреме питання та відповідь (як я це робив тут) щодо вирішення помилки, яку ви бачите. Потім ви можете зв’язати це питання в коментарях до цього.
me_and
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.