如何在不使用物理开关/插座的情况下立即关闭计算机(1 到 5 秒)?

Usm*_*man 25 linux shutdown command-line

是否有任何命令/程序可以让我立即关闭系统(1 到 5 秒)?

更新(2015):感谢那些建议关闭电源插座的人。:D

更新(2016 年): @technophile 建议我应该在描述问题性质的问题中添加一些信息 - 主要是我试图解决哪种情况。这是几年前提出这个问题的场景。

我们正在构建一个可部署在公共场所(如机场、酒店等)的系统。人们可以使用该系统使用信用卡上网、查看电子邮件甚至预订等。构建的系统确保第二个用户无法获得该系统前一个用户的信息(电子邮件、信用卡),即使键盘记录器类软件以某种方式安装。系统是如何确定的?好吧,无法共享详细信息,因为那不是公开信息。但是我们开发了一种方法,可以为系统的新用户始终拥有全新的操作系统(就像是新安装的一样)。唯一的问题是我们必须关闭机器并在第一个用户离开机器后立即重新启动。

而且我希望关闭立即快速( - 这就是问题的原因)并且下一次启动也非常快,为此我研究并尝试了大量 Linux 发行版,从 Damn Small Linux 到 Slackware 到 Debian 等,但这是一个单独的故事。

Fel*_*lix 39

sudo shutdown -h now
Run Code Online (Sandbox Code Playgroud)

  • @Marcel Korpel:在不损坏系统的情况下立即执行;) (17认同)
  • 那不会**立即**关闭系统。;) (10认同)
  • @Gnoupi:没有一些突然关闭的漏洞,任何操作系统都无法构建。否则,最快的关机方法就是拔掉电源线。 (3认同)
  • 这个答案不正确。它没有回答要求立即断电的问题。正确的命令是“halt -f”。 (2认同)
  • 对于“halt”,传递一个“-f”仍将由系统管理器执行干净关闭,传递“-f”两次将立即执行不干净关闭,而根本不执行任何序列。例如,“halt -f -f -p”将立即关闭机器电源,而“halt -f -f --reboot”将立即重新启动机器。 (2认同)

Has*_*tur 19


如果您不是出于特殊原因,我不建议您执行以下操作:

kill -SEGV 1   # should generate a core dumps and kernel panic
kill -ABRT 1   # should generate a core dumps and kernel panic
kill -9 1      # On old systems worked nowadays not
Run Code Online (Sandbox Code Playgroud)

它粗暴、残酷,可以被认为 与拔掉电源线非常相似......

正确的方法shutdown -h nowsudo在需要的时候了。
也许我应该说合法的方式;见下文或更好tl;dr。


再多说几句,又名故事,第一章一
开始是init,直到最后。

整个的Linux取决于从关怀INIT [ 1 ] [ 2 ]。尽管如此,并非没有一定程度的忘恩负义,曾经有一段时间,好主root 用户可以背叛这种爱并突然kill以无可争议的 ( -9) 命令初始化。
礼仪之书规定伯爵、公爵和侯爵用户在 a 之前调用sudo)。

然后一些巫师制作了一个护身符来保护 init(来自 之书man 2 init

唯一可以发送到进程 ID 1(init 进程)的信号是那些 init 已明确安装信号处理程序的信号。这样做是为了确保系统不会意外关闭。

(我们的间谍报告[ U1 ] init 将处理 1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)
所以好主root 用户 了解消息并更改命令,kill -ABRT 1或者kill -SEGV 1通常会生成一个内核恐慌和核心转储。

它起作用是因为init是第一个运行的进程并采用 PID 编号 1 [ 2b ]

这是不安全的,不明智的,你觉得这是不祥之兆和诅咒的先驱,但如果你不能实质性地把手放在上面并拔掉它......

诅咒:它不会写入日志,它不会杀死所有进程并等待它们的结束,它不会写入 HDD 正确更新 inode,也不会卸载文件系统;甚至不介意它会保存图形窗口和外壳历史记录的选项,以及许多超出我们想象的东西......正如我们所说的,这几乎相当于拔掉电源线或笔记本电脑的电池。


正确的方式
“Non nobis, Domine, non nobis, sed nomini tuo da gloriam.”,圣殿骑士的座右铭。
合法的(正确的)的方法是使用shutdown[ 3 ]

sudo shutdown -h now
Run Code Online (Sandbox Code Playgroud)

关机安排以安全的方式关闭系统。所有登录用户都会收到系统正在关闭的通知,并且...

但是-h now他们将没有足够的时间做这么多......


再多说几句,又名故事,第二章
曾几何时,一些逻辑步骤从 unix 人的天空中感受到:

一旦系统进程被杀死并且文件系统被卸载,系统就会自动停止/关闭电源或重新启动。这是使用halt 或reboot 命令完成的,该命令将更改同步到磁盘,然后执行实际的暂停/关闭电源或重新启动。[ 4 ]

实际上,如今,我们不相信任何更在三摩伊赖的存在[ 5 ] 中的Linux世界rebootpoweroffhalt[ 6 ]:对现代科学ls -l $(which poweroff halt reboot)和的一个man reboot,在这黑暗时代的价差新光源及显示我们它只存在一个解析所有选项的真正命令,以便我们最终可以自由地要求与它们的命令名称相矛盾的操作!(halt -preboot -ppoweroffshutdown -rreboot...)

现在一切似乎对所有人来说都是清晰而舒适的,谣言声称[ 7 ]systemd 工具集[ 8 ]黑社会中进行了一场革命,而没有意识到整个世界。多亏了一大群向后兼容的垫片,我们根本没有注意到重启、关机、停止[ 6 ]甚至 telinit [ 9 ]和关闭[ 3 ]都已经绑定到新的国王 systemctl [ 10 ] . 请从JdeBP The Bard [ 9 ]的原声听整个故事,因为我已经没有呼吸了。

如果您是 Ubuntu 邪教的追随者,您可能仍会在一段时间内了解所有这些主张[ 11 ]


halt -f, init, telinit,的中间地球systemctl
寻找解决方案比正确的解决方案更快但同样明智。

systemctl --force --force poweroff  # the most close to kill -9 1 
systemctl --force poweroff          # rough but still safe
sudo halt -f                                       # rough
sudo telinit 0        # or 6                       # safe
kill -SIGINT 1        # cause reboot   as the reboot command
kill -SIGRTMIN+4 1    # cause shutdown as the halt command
Run Code Online (Sandbox Code Playgroud)

无论您是否在 systemd 下,您都应该能够在不调用所有正确关闭程序的情况下停止计算机(因此速度更快):

  1. halt -f:使用上述命令指定选项-f(请注意,您需要-f避免关闭程序),使用sudo poweroff -f或什至使用sudo reboot -f -h. 事实上,我们可以从man reboot(和等价物)中了解到需要指定-f避免调用关闭的选项:

    当使用--force或运行级别 0 或 6 调用时,此工具调用 reboot(2) 系统调用本身(传递 REBOOTCOMMAND 参数)并直接重新启动系统

    否则,这只是使用适当的参数调用 shutdown(8) 工具而不传递 REBOOTCOMMAND 参数。

    -f, --force
    不调用 shutdown(8) 而是执行您期望从 name 中获得的实际操作

  2. 此外,您可以使用telinit [ 2b ](或init直接使用)

    sudo telinit 0    # or 6
    
    Run Code Online (Sandbox Code Playgroud)

    告诉 init 改变运行级别...但如果是这样为什么不直接杀死它?

  3. 在 systemd 下,您可以使用不明智的双重选项 --force --force

    systemctl --force --force poweroff  
    
    Run Code Online (Sandbox Code Playgroud)

    阅读 systemctl 手册[ 10 ]

    -f, --force
    与 enable 一起使用时,覆盖任何现有的冲突符号链接。
    当与使用haltpoweroffreboot或的kexec,执行所选择的操作,而无需关闭所有单元。但是,所有进程都将被强制终止,并且所有文件系统都以只读方式卸载或重新挂载。因此,这是请求立即重新启动的一个激烈但相对安全的选项。如果为这些操作指定了两次 --force,它们将立即执行而不会终止任何进程或卸载任何文件系统。警告:对这些操作中的任何一个指定 --force 两次可能会导致数据丢失。

Ps> 从尾部 JdeBP The Bard [ 7 ] 中获取有关变体的灵感。

  • 这个答案太棒了! (3认同)

Aar*_*ton 16

您可以通过以 root 身份或以对该文件具有写入权限的任何用户身份将“o”写入 /proc/sysrq-trigger 来立即关闭机器,而无需同步磁盘。

作为一个 shell 脚本,它看起来像

#!/bin/sh
echo o >/proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)

有一个关于 sysrq 的 sysctl 选项,但该选项仅影响键盘触发。

如果您想立即重新启动而不是断电,您可以发送“b”而不是“o”;但请记住,虽然 sysrq-trigger 是最快的关闭方式,但可能有更快的重启方式。主板固件 (BIOS/UEFI) 可能需要大量时间来重新初始化硬件,因此使用 kexec 来实现重新启动通常会更快,因为硬件保持初始化状态。

您可能知道,在您将文件系统挂载为可写的任何情况下,都不建议这样做,即使您认为在挂载该文件系统时您没有为该文件系统编写任何重要的内容。即使您不关心该文件系统上数据的完整性,像这样关闭或重新启动也会使启动变慢。

确保没有任何持久文件系统被挂载为可写。

  • 这是这个问题的最佳答案。OP 明确表示他希望以类似的方式关闭系统,就像拔掉电源一样,他们不关心损坏或“正确执行”。我不明白为什么没有人能理解这一点。 (7认同)
  • `b` 而不是 `o` 重新启动(自问题更新以来相关)。 (2认同)
  • 老实说,我希望我可以不止一次地对这个解决方案进行投票,因为它“完全”满足了OP的要求,在一秒钟内完成,并且在所有其他解决方案都没有的情况下为我工作(我的系统挂在某些东西上并且我无法做任何其他事情) (2认同)

ele*_*n81 8

您必须使用Magic SysRq组合REISUB

跟我重复一遍:“养大象太无聊了……

  • 不。REISUB 将重新启动它。REISUO 将关闭。或者干脆O。 (4认同)

Jon*_*nik 5

poweroff
Run Code Online (Sandbox Code Playgroud)

这应该适用于最常见的发行版。与 不同shutdown,在许多系统上,您可以以普通用户身份执行此操作(不需要 sudo)。

编辑:进一步阅读: