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


17

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

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

更新(2016): @technophile建议我在问题中添加一些信息以描述问题的性质-主要是我想解决的情况。这是几年前提出此问题的方案。

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

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


1
由于最快的代码是不会运行的代码,因此我想说,关闭系统的最快方法是不开机。如果您需要特定的答案,请说明您要达到的目标。
德米特里·格里戈里耶夫

2
@ Sam152哪堵墙?
choc

您是否还想指定“不损坏我的系统”,还是不担心?
Technophile 2015年

@Technophile当然不会永久损坏我的系统。但是,您有什么想法?
choc

我的目的是弄清楚您的要求和尝试要做的事情。我从事电子行业;“立即”是指1秒吗?1毫秒?1美元?1ns?您只是急躁,还是有一些特定需求?(例如)6秒的关机时间会带来什么后果?我正在使用一个嵌入式系统,如果在按住电源按钮的情况下关机时间超过5秒,则会损坏其SD卡。你在做什么?
Technophile

Answers:


32
sudo shutdown -h now

9
那不会立即关闭系统。;)
Marcel Korpel 2010年

14
@Marcel Korpel:在不破坏系统的情况下应立即采取行动;)
Felix 2010年

@Felix-我一直听到Linux是一个非常强大的系统,它不能像Windows一样承受同样的“硬重启”吗?会令人惊讶;)
Gnoupi 2010年

2
@Gnoupi:如果没有一些突然关闭的漏洞,则无法构建任何操作系统。否则,最快关机方法的答案是拉动电源线。
harrymc

1
某些版本的语法不同。“ sudo shutdown -g0 -y -i5”(Solaris)。当然,只是要使其变得困难,对于不同系统上的关机,“ i”后面的确切值可能会有所不同。我相信在其他许多系统上,它的关闭状态均为0。叹。要爱标准,那么多可供选择!
Brian Knoblauch

14

如果您不是因为真正的特殊原因而被强迫,我不建议您执行以下操作:

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

它粗糙,残酷,可以认为 相当于拔下电源线 ...

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


还有更多的话,也就是故事,第一章
最初是初始化,直到最后。

整个Linux取决于对init [ 1 ] [ 2 ]的关心。但是,并非没有一定程度的忘恩负义,好主主根使用者有时会背叛这种爱,并突然以不可辩驳的()顺序成立。《礼节》规定了用户在a之前调用的计数,公爵和侯爵夫人)。 kill-9
sudo

然后,一些向导创造了一种保护init的魅力(来自man 2 init

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

(我们的间谍报告[ U1 ]初始化将处理1 HUP 6 ABRT 11 SEGV 15 TERM 30 PWR 2 INT 10 USR1 14 ALRM 17 CHLD 32)
因此,良好的Lord root用户 了解消息并更改命令,kill -ABRT 1否则kill -SEGV 1通常会生成一个内核崩溃和核心转储。

之所以起作用,是因为init是第一个运行的进程,其PID号为1 [ 2b ]

这是不安全,不明智的,您会感觉到它预兆着坏兆头和诅咒,但是如果您不能实质性地把手放开并拔下插头的话……

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


正确的方式
“非诺比斯,多米诺骨牌,非诺比斯,圣诺瓦比诺。”,圣殿骑士团的座右铭。
合法的(正确的)的方法是使用shutdown[ 3 ]

sudo shutdown -h now

关闭可以安全地关闭系统。通知所有登录的用户系统正在关闭,并且...

但是有了-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 ]和shutdown [ 3 ]都已经绑定到新的国王systemctl [ 10 ]。请听JdeBP The Bard [ 9 ]的原始声音来讲述整个故事,因为我没有呼吸了。

如果您是Ubuntu邪教的追随者,您可能仍然会在一段时间内对所有这些主张保持警觉[ 11 ]


中间地球halt -finittelinitsystemctl
搜索解决方案比正确的速度较快,但也明智的。

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

无论您是否处于系统状态下,都应该能够在不调用所有正确的关机程序的情况下停止计算机(并且这样会更快):

  1. halt -f:使用或什至可以通过上述命令指定选项-f(请注意,您需要-f避免关闭程序)。实际上,我们可以从(和等效的文件)中了解到需要指定避免调用shutdown 的选项:sudo poweroff -fsudo reboot -f -hman 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
    

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

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

    systemctl --force --force poweroff  
    

    阅读systemctl手册[ 10 ]

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

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


9

通过以root身份将“ o”写入/ proc / sysrq-trigger,可以立即关闭计算机电源,而无需同步磁盘。

作为shell脚本,它看起来像

#!/bin/sh
echo o >/proc/sysrq-trigger

如果您对/ proc / sysrq-trigger具有权限,则不必通过sysctl启用它。该选项仅影响键盘触发。

我不建议在具有任何以后要阅读的文件系统的计算机上执行此操作。

我在Google Compute Engine上使用此功能在10分钟标记之前屠杀了模板化实例,以最大程度地发挥集群工作的成本效益,效果很好。


5
这是对这个问题的最佳答案。OP明确表示,他想以类似的方式关闭系统,就像拔掉电源一样,他们不在乎损坏或“正确执行”操作。我不明白为什么没人能理解。
Petr

1
b而不是o重新启动(与问题更新有关)。
卡米尔Maciorowski




2

按住电源键约4秒钟,速度非常快。


1
如果这样做,实际上打开电源开关会更快;)
Gnoupi 2010年

假设操作系统进行电源管理,则此方法与其他任何关机方法相同。
harrymc

1
如果您实际上迫不及待要等待几秒钟,并且将要断电,请使用诸如ext3 / ext4之类的日志文件系统,以免因未写操作而丢失太多数据。
CarlF

不寻找执行关机的非编程/非软件方式,否则@Gnoupi建议会更快。;)
choc

2

在某些Linux发行版中,shutdown提供了-n选项。(请参见man shutdown)。某些发行版(例如使用upstart而不是sysvinit的ubuntu)不支持他的标志,并且该标志(如可从联机帮助页中了解)并非没有风险。尽管我已经使用了多年(在我的笔记本电脑上,我并不关心所有守护进程是否正确终止,它只是想杀死所有守护进程并刷新磁盘缓存)(比常规关闭速度更快,而且比拉出硬盘更安全)插入(和朋友))。您可以看到这是否解决了您的问题。


2

我使用了这个小脚本来关闭系统。实际上,这是在“原型”机器上作恶作剧的:“嘿,伙计,让我们看看.sh的出色表现!”

#!/bin/bash
echo 1 > /proc/sys/kernel/sysrq-trigger; #enables sysrq triggers
echo u > /proc/sysrq-trigger # remount the system as ready only
#edited# echo s > /proc/sysrq-trigger # sync all write-pending data to disk
sync
echo o > /proc/sysrq-trigger # shut off the system power.

(此脚本模仿相同击球Alt+ SysRq+ u/ s/ o如前所述。)当然I'T原因的异常终止系统(MySQL表等可能会崩溃)中,等等虚设机器只使用。注意:同步可能需要一些时间。我已经看到,如果系统有很多可用内存(用于缓存),并且您将一堆文件复制到笔式驱动器上,则同步会花费更多时间,但是即使恶作剧,我也建议您这样做。

编辑:最好使用sync而不是将's' sysrq-trigger写入:写's'不会阻止脚本执行,因此在请求将缓存写入磁盘后,计算机将立即关闭。与sync命令相反,sync写入过程完成后将返回。因此,脚本执行将被阻止,直到完成缓存刷新为止。


1
你不应该在“ u”之前吗?另外,作为一个循环:SEQUENCE=(s u o); for i in "${SEQUENCE[@]}"; do sleep 3; printf "${i}" > /proc/sysrq-trigger; done
Que Quotion '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.