我正在使用 rhel5 / rhel6,我想知道如何“停止 startx”。我已经在 Google 上搜索过这个问题,大多数解决方案是将 inittab 更改为 5,或 init 3 等。
例如,在服务器以运行级别 3 启动后,有人运行 startx,服务器现在正在监听端口 6000。更改 inittab(需要重新启动,这不是一个选项,之后我仍然能够输入 startx)并init 3
没有真正解决问题,服务器仍然在监听端口 6000,并且 GUI 仍然存在。
我可以知道是否有任何命令可以真正“停止startx”,以便我可以运行startx -- -nolisten tcp
答案1
关闭时需要注意两点:
- 您需要彻底关闭 X 服务器本身,以免让图形硬件处于未定义的状态。
- 您需要考虑在 X 服务器关闭之前是否需要彻底关闭 X 会话中运行的任何程序。
X 服务器和会话中的第一个进程都将由 启动xinit
。一旦会话中的第一个进程终止,xinit
将负责关闭 X 服务器。因此,如果您找到该进程并将其终止,X 服务器也应该会很快消失。
我将使用此命令来查找 X 会话中运行的进程:
ps -fA --forest | less
您也可以直接向 X 服务器发送 SIGTERM 信号来终止它。然后它将彻底关闭,并且所有剩余的客户端都将失去连接。
xinit
作为参考,这是X 会话中第一个进程死亡时运行的代码:
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");
}