Em novembro de 2014 , as versões mais recentes de startxwinuso xinitpara iniciar o servidor Cygwin / X, que é realmente chamado XWin.exe. O processo é mais ou menos assim:
- Você chama
startxwin
startxwincria um novo .Xauthorityarquivo e um chamado .serverauth.1234(onde 1234muda sempre que você inicia o X)
startxwin configura alguns parâmetros de cliente e servidor
startxwinchama xinitcom os parâmetros do cliente e do servidor, incluindo alguns scripts shell opcionais e uma referência ao arquivo auth.
xinit inicia o servidor X, executando alguns dos scripts rc
xinitinicia o xtermscript cliente (geralmente ) ou cliente rc. Queremos evitar isso
- Quando você fecha o cliente ou o script rc do cliente termina,
xinitencerra o servidor X. Se evitarmos a etapa 6, também precisamos evitar isso
É possível executar XWin.exediretamente de dentro de um shell de login Bash, sem as tarefas que cercam essa startxwine xinitexecutar. A principal vantagem disso é que ele se comporta como queremos: o servidor X inicia e permanece em execução. Infelizmente, como não há .Xauthorityarquivo passado durante a inicialização, o servidor X permitiria a conexão de qualquer processo local, o que é inseguro.
Felizmente, ele xinitfaz a maioria das coisas que não queremos. Há um hack rápido que ignora, xinitmas mantém os elementos restantes startxwinrelacionados ao próprio servidor.
TL; DR: No startxwin, há uma linha na parte inferior que lê:
eval xinit \"$client\" $clientargs -- \"$server\" $display $serverargs
Mude essa linha para:
eval \"$server\" $display $serverargs
A partir de agora, o startxwinscript chamará XWin.exediretamente, em vez de chamar xinit. Obviamente, isso desativará os scripts rc do cliente, mas não os queremos em primeiro lugar. Isso também significa que o X continuará sendo executado sem a necessidade de um processo do cliente para mantê-lo vivo (ou seja, não o xinitmate).
exec sleep infinitycomo mostrado aqui: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit