Há duas coisas a serem lembradas ao encerrá-lo:
- Você precisa que o próprio servidor X seja encerrado de maneira limpa, de modo que você não deixe o hardware gráfico em um estado indefinido.
- É preciso considerar se alguma coisa em execução na sessão X precisar ser encerrada antes que o servidor X seja encerrado.
O servidor X e o primeiro processo da sessão serão iniciados por xinit
. Quando o primeiro processo da sessão for interrompido, xinit
resolverá encerrar o servidor X. Então, se você encontrar esse processo e matá-lo, o servidor X deve ser removido logo após.
Eu usaria este comando para encontrar os processos em execução na sessão X:
ps -fA --forest | less
Você também pode simplesmente matar o servidor X diretamente enviando um sinal SIGTERM para ele. Ele será encerrado de forma limpa e todos os clientes restantes perderão a conexão.
Para referência, este é o código que xinit
será executado quando o primeiro processo na sessão X tiver falecido:
static void
shutdown(void)
{
/* have kept display opened, so close it now */
if (clientpid > 0) {
XSetIOErrorHandler(ignorexio);
if (! setjmp(close_env)) {
XCloseDisplay(xd);
}
/* HUP all local clients to allow them to clean up */
if (killpg(clientpid, SIGHUP) < 0 && errno != ESRCH)
Error("can't send HUP to process group %d", clientpid);
}
if (serverpid < 0)
return;
if (killpg(serverpid, SIGTERM) < 0) {
if (errno == ESRCH)
return;
Fatal("can't kill X server");
}
if (!processTimeout(10, "X server to shut down"))
return;
Errorx("X server slow to shut down, sending KILL signal");
if (killpg(serverpid, SIGKILL) < 0) {
if (errno == ESRCH)
return;
Error("can't SIGKILL X server");
}
if (processTimeout(3, "server to die"))
Fatalx("X server refuses to die");
}