如何停止 Linux 上正在运行的 startx。不仅仅是更改 inittab 或 init3

如何停止 Linux 上正在运行的 startx。不仅仅是更改 inittab 或 init3

我正在使用 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");
}

相关内容