重启 Linux 的 3 个命令(以及另外 4 种安全重启方式)

了解如何通过多种不同的方法重启 Linux,从 GUI 到命令行深处。
213 位读者喜欢这篇文章。

Linux 完全有能力在无需重启的情况下运行数周甚至数年。在某些行业中,由于 kpatchkgraph 等技术的进步,Linux 正是这样做的。

但是,对于笔记本电脑和台式机用户来说,这个指标有点极端。虽然可能不是每天都需要,但至少每周都会遇到需要重启机器的情况。对于一个不需要经常重启的系统来说,Linux 提供了很多在需要重新启动时的选择。

了解你的选项

在继续之前,先说明一下重启。重启在每个操作系统上都是一个独特的过程。即使在 POSIX 系统中,由于不同的初始化系统或命令设计,关机和重启命令的行为也可能有所不同。

尽管存在这个因素,但有两个概念至关重要。首先,重启在 POSIX 系统上很少是必需的。如果需要,你的 Linux 机器可以在无需重启的情况下运行数周或数月。除非软件安装程序或更新程序明确建议这样做,否则无需通过重启来“刷新”你的计算机。当然,重启也没有坏处,所以这取决于你。

其次,重启应该是一个友好的过程,它允许程序退出、文件保存、临时文件删除、文件系统日志更新等等。在可能的情况下,始终使用预期的界面重启,无论是在 GUI 还是终端中。如果你强制计算机关机或重启,你可能会丢失未保存甚至最近保存的数据,甚至损坏重要的系统信息;只有在别无选择的情况下才应该强制关闭计算机

点击按钮

重启或关闭 Linux 的第一种方法是最常见的方法,也是对于大多数桌面用户来说最直观的方法,无论他们使用什么操作系统:它是 GUI 中的电源按钮。由于关机和重启是工作站上的常见任务,你通常可以在几个不同的位置找到电源按钮(通常带有重启和关机选项)。在 GNOME 桌面中,它位于系统托盘中:

The GNOME power button.

它也位于 GNOME 活动菜单中

The GNOME Activities menu power button.

在 KDE 桌面中,电源按钮可以在 应用程序菜单中找到

The KDE power buttons via the Applications menu.

你也可以通过右键单击桌面并选择 离开 选项来访问 KDE 电源控制,这将打开你在此处看到的窗口

The KDE power buttons via the Leave option.

其他桌面提供了这些主题的变体,但总体思路是相同的:使用鼠标找到电源按钮,然后单击它。你可能需要在重启和关机之间进行选择,但最终结果几乎相同:进程被友好地停止,以便数据被保存,临时文件被删除,然后数据同步到驱动器,然后系统关机。

按下物理按钮

大多数计算机都有一个物理电源按钮。如果你按下该按钮,你的 Linux 桌面可能会显示一个电源菜单,其中包含关机或重启选项。此功能由 高级配置和电源接口 (ACPI) 子系统提供,该子系统与你主板的固件通信以控制你计算机的状态。

ACPI 很重要,但它的范围有限,因此从用户的角度来看,没有太多可配置的内容。通常,ACPI 选项通常称为 电源,并设置为合理的默认值。如果你想更改此设置,可以在系统设置中进行更改。

在 GNOME 上,打开系统托盘菜单并选择 活动,然后选择 设置。接下来,在左侧列中选择 电源 类别,这将打开以下菜单

GNOME’s power button settings.

挂起和电源按钮 部分中,选择你希望物理电源按钮执行的操作。

这个过程在不同桌面之间是相似的。例如,在 KDE 上,系统设置 中的 电源管理 面板包含一个 按钮事件处理 选项。

KDE Power Management

opensource.com

在你配置按钮事件的处理方式后,按下计算机的物理电源按钮将执行你选择的任何选项。根据你的计算机供应商(或者零件供应商,如果你是自己组装电脑),按下按钮可能只需轻轻一按,或者可能需要稍长一点的按压,因此你可能需要进行一些测试才能掌握窍门。

但要注意按压时间过长,因为它可能会在没有警告的情况下关闭你的计算机。

运行 systemctl 命令

如果你更多地在终端而不是 GUI 桌面中操作,你可能更喜欢使用命令重启。广义上讲,重启和关机是 init 系统的过程——程序序列,它在收到电源信号(分别是开或关)后启动或关闭计算机。

在大多数现代 Linux 发行版中,systemd 是 init 系统,因此重启和关机都可以通过 systemd 用户界面 systemctl 执行。systemctl 命令接受许多其他选项,包括 halt(停止磁盘活动但不切断电源)、reboot(停止磁盘活动并向主板发送复位信号)和 poweroff(停止磁盘活动,然后切断电源)。这些命令大多等同于启动同名的目标文件。

例如,要触发重启

$ sudo systemctl start reboot.target

运行 shutdown 命令

systemd 出现之前的传统 UNIX(以及对于某些 Linux 发行版,例如 Slackware,现在仍然如此),有专门用于停止系统的命令。例如,shutdown 命令可以关闭你的机器,但它有几个选项来精确控制这意味着什么。

此命令需要一个时间参数,以分钟为单位,以便 shutdown 知道何时执行。要立即重启,请附加 -r 标志

$ sudo shutdown -r now

要立即关机

$ sudo shutdown -P now

或者你可以使用 poweroff 命令

$ poweroff

要在 10 分钟后重启

$ sudo shutdown -r 10

shutdown 命令是关闭或重启计算机的安全方式,它允许磁盘同步和进程结束。此命令会阻止在关机开始前的最后 5 分钟内进行新的登录,这在多用户系统上尤其有用。

在今天的许多系统中,shutdown 命令实际上只是调用带有适当重启或关机选项的 systemctl

运行 reboot 命令

reboot 命令本身基本上是 shutdown -r now 的快捷方式。从终端来说,这是最简单快捷的重启命令

$ sudo reboot

如果你的系统被阻止关机(可能是由于失控进程),你可以使用 --force 标志强制系统关机。但是,此选项会跳过实际的关机过程,这对于正在运行的进程来说可能是突然的,因此只有在 shutdown 命令阻止你关机时才应使用它。

在许多系统中,reboot 实际上是调用带有适当重启或关机选项的 systemctl

Init

在没有 systemd 的 Linux 发行版上,你的计算机理解多达 7 个运行级别。不同的发行版可以唯一地分配每种模式,但通常,0 启动停止状态,而 6 启动重启(中间的数字表示状态,例如单用户模式、多用户模式、GUI 提示符和文本提示符)。

这些模式在没有 systemd 的系统上的 /etc/inittab 中定义。在使用 systemd 作为 init 系统的发行版上,/etc/inittab 文件要么丢失,要么只是一个占位符。

telinit 命令是你 init 系统的前端。如果你正在使用 systemd,那么此命令是指向带有适当选项的 systemctl 的链接。

要通过将计算机发送到运行级别 0 来关机

$ sudo telinit 0

要使用相同的方法重启

$ sudo telinit 6

此命令对你的数据有多不安全完全取决于你的 init 配置。大多数发行版都试图通过将运行级别映射到友好的命令来保护你免受直接拔电源(或数字等效操作)的影响。

你可以通过读取 /etc/rc.d/etc/init.d 中的 init 脚本,或通过读取 /lib/systemd/system/ 中的 systemd 目标来亲自查看每个运行级别发生的情况。

应用蛮力

到目前为止,我已经介绍了重启或关闭 Linux 计算机的所有正确方法。为了完整起见,我在此处包含其他关闭 Linux 计算机的方法,但绝不推荐这些方法。它们不是作为日常重启或关机命令(rebootshutdown 就是为此而存在的)设计的,但它们是完成任务的有效手段。

如果你尝试这些方法,请在虚拟机中尝试。否则,仅在紧急情况下使用它们。

Proc

比 init 系统更低一级的是 /proc 文件系统,它是计算机上几乎所有正在发生的事情的虚拟表示。例如,你可以将你的 CPU 视为文本文件(使用 cat /proc/cpuinfo),查看笔记本电脑电池还剩多少电量,或者以某种方式重启你的系统。

Linux 内核中有一个用于系统请求的规定(大多数键盘上的 Sysrq)。你可以使用组合键直接与此子系统通信,理想情况下,无论你的计算机处于什么状态;在某些键盘上,情况会变得复杂,因为 Sysrq 键可能是一个特殊的功能键,需要不同的键才能访问(例如许多笔记本电脑上的 Fn)。

一种不太可能失败的选项是使用 echo 手动将信息插入 /proc。首先,确保 Sysrq 系统已启用

$ sudo echo 1 > /proc/sys/kernel/sysrq

要重启,你可以使用 Alt+Sysrq+B 或键入

$ sudo echo b > /proc/sysrq-trigger

这种方法不是定期重启机器的合理方式,但它可以在紧急情况下完成任务。

Sysctl

内核参数可以在运行时使用 sysctl 进行管理。有很多内核参数,你可以使用 sysctl --all 查看所有参数。在你知道要查找什么之前,大多数参数可能对你来说意义不大,在这种情况下,你要查找的是 kernel.panic

你可以使用 -–value 选项查询内核参数

$ sudo sysctl --value kernel.panic

如果你得到返回的 0,那么你正在运行的内核没有特殊设置,至少默认情况下没有,以便在内核崩溃时重启。这种情况相当典型,因为在灾难性系统崩溃时立即重启会使诊断崩溃原因变得困难。然而,无论如何都需要保持运行的系统可能会受益于内核故障后自动重启,因此这是一个在某些情况下会被启用的选项。

你可以作为实验激活此功能(如果你正在跟进,请在虚拟机而不是你的实际计算机上尝试此操作)

$ sudo sysctl kernel.reboot=1

现在,如果你的计算机遇到内核崩溃,它将被设置为重启,而不是耐心地等待你诊断问题。你可以通过使用 sysrq 模拟灾难性崩溃来测试这一点。首先,确保 Sysrq 已启用

$ sudo echo 1 > /proc/sys/kernel/sysrq

然后模拟内核崩溃

$ sudo echo c > /proc/sysrq-trigger

你的计算机立即重启。

负责任地重启

了解所有这些选项并不意味着你应该全部使用它们。仔细思考你想要完成什么,以及你选择的命令将做什么。你不想因为鲁莽而损坏你的系统。这就是虚拟机的用途。但是,拥有如此多的选项意味着你已为大多数情况做好准备。

我是否遗漏了你最喜欢的重启或关闭系统的方法?在评论中列出我遗漏的内容!

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算行业工作,并且经常同时工作。

12 条评论

对我来说,shutdown 命令在任何情况下都是最常用的。但总是很高兴知道其他可用的选项。感谢分享。

要关机,我通常使用 ``poweroff``。

我很少重启,但当我重启时,我只使用 ``reboot``。

我认为它们在不同的发行版中被适当地重新映射是非常棒的,因为我在我的主要工作站上使用 Slackware,在我的笔记本电脑上使用 RHEL 或 Fedora。

回复 ,作者:marco.bravo

当你的系统完全冻结时,唯一的选择是按住电源按钮直到它关闭。你可能会丢失一些数据,但我会经常保存我正在处理的任何重要内容。

对于 shutdown 命令有用的另一件事是指定关机/重启时间,例如 13:30,'sudo shutdown -r 13:30' 在下午 1:30 重启,或某个间隔,'sudo shutdown -r +40' 在 40 分钟后重启。当你正在进行编译软件或更新之类的操作时,你可能会使用这些,这些操作需要一些时间,但你知道会在某个间隔后完成。

哇,不错,感谢分享。

脚本是问题所在。。。

为什么在 GUI 中,我只需点击几次即可挂起(或关机),而无需root密码,但尝试编写脚本来做同样的事情却需要授权?这对我来说毫无意义。

我最近一次遇到这个问题是在一个使用 handbrakeCLI 进行转码的脚本中,并且希望系统在完成时(在夜间某个时间)挂起。我能想到的唯一方法是在“sudo -s”终端中运行脚本,然后在稍后更改所有权,这似乎相当荒谬。

(而且我认为这并非总是如此。我相当肯定多年前我可以从脚本运行 shutdown 而无需授权)

桌面环境本身具有与其关联的权限;如果你要杀死它,你将必须授权才能重启 KDM 或 GDM 或你使用的任何登录管理器。

如果你希望普通用户能够在没有特殊授权的情况下重启或停止或关机,你可以将该用户添加到你的 sudoers 文件中

%admin ALL=NOPASSWD: /usr/sbin/halt, /usr/sbin/reboot, /usr/sbin/poweroff

如果你的当前用户还不是 ``wheel`` 组的成员,请使用以下命令将自己添加到该组:

$ sudo usermod -a -G wheel $USER

现在你的用户可以发出 ``sudo reboot`` 等命令而无需输入密码。预授权已通过 sudo 授予。

你也可以只将自己添加到一个已经有权在没有授权的情况下重启和停止的特殊组中,但哪个组取决于你的发行版如何设置组。

另一种可能性是你的用户有权关机或重启,但无权访问它们存储的位置(例如 /sbin 或 /usr/sbin)。同样,将该用户添加到管理组是提供访问权限的简单方法。

回复 ,作者:Gen Agg (未验证)

“shutdown -hP now” 对我来说。这在与一个系统作斗争后,该系统在先停止之前不会关机。
感谢其他的几个技巧,在紧急情况下可能会有用。

这是一个很棒的数据点。我不认为我遇到过一个做出这种区分的系统(要么就是我从未遇到过一个有这种区分的系统,在这种系统上我也获得了停止或关机的权限)。

回复 ,作者:Simon Harrison (未验证)

如果我的电脑卡住了,我使用 REISUB 命令。
没人听说过吗?
它是键盘快捷键上的内核调用映射。
按下 Alt+sys+ R 然后 E 然后 I 然后 S 然后 B。
最后一个将重启,其中一个将停止磁盘写入等等。

实际上,我没有听说过那个!我听说过映射到键盘快捷键的类似调用(我在文章中提到了一个)。这个很棒,值得了解,谢谢!

回复 ,作者:William (未验证)

© . All rights reserved.