进一步阅读

进一步阅读

我不知道是否“单用户模式“是正确的术语,但我在这里:

在 GRUB 菜单上,我按下E编辑运行配置。在以 开头的行中linux,我附加了以下内容:

rw init=/bin/bash

并按下F10。计算机启动至 root shell,无需询问任何密码。

问题是,信号不起作用。例如,当我运行命令时,我无法通过按Ctrl+退出该命令C

这是预期的吗?如果是,原因是什么?我该如何解决这个问题?与单用户模式下的终端模拟器有关吗?

答案1

很长一段时间以来,单用户模式都不是正确的术语。在 20 世纪 90 年代,曾经是单用户模式分成应急模式救援模式。事实上你并没有使用其中任何一个。

您实际上正在做的事情是一个糟糕的主意,因为它涉及将程序作为进程 #1 运行,而该程序并不是为执行进程 #1 实际需要执行的工作而设计的。您最好使用紧急或救援模式,后者由公认答案就是你所指向的答案本身所指向的。

是的,信号会表现得很奇怪。对于初学者来说,进程 #1 对信号有特殊的语义,这是init=/bin/bash一个糟糕主意的几个原因之一。此外,作业控制 shell 无法在/dev/console其标准 I/O 时进行作业控制,但没有与控制终端建立适当的会话,如 Bourne Again shell实际上告诉过你一启动。

可以使用一些简单的链加载工具与控制终端建立适当的会话,从而启用作业控制并将信号传递到前台进程组,但这并不能解决所有问题其他作为 process #1 程序会出现问题的事情,/bin/bash因为你必须手动明确地小心地完成它们。

只需使用救援模式或紧急模式即可。

进一步阅读

答案2

正如其他人提到的,/dev/console并不总是充当真正的 tty,这限制了作业控制。

但实际上,您可以简单地启动一个 shell连接到 tty ...

/usr/bin/setsid /bin/bash -ilm <> /dev/tty9 >&0 2>&0 &

...然后点击alt-F9切换到 VT#9,新 shell 应该在其中运行,并启用作业控制。 (您可以选择任何尚未使用的 VT,只需将上面的所有三个 9 更改为您想要使用的任何值即可。)

另外,PID 为 1 的 shell 意味着它继承每个孤儿进程;大多数 shell 都可以处理这个问题,因为它们必须能够处理在调用execve启动 shell 本身之前创建子进程的情况,但有些人可能会感到困惑,或者做一些奇怪的事情,比如在调用 shellSIGCHLD时忽略它们。不认为他们有什么优秀的孩子。对于这些,当您在其他 shell 中工作时使其保持运行可能会有所帮助:

while : ; do wait ; done

相关内容