Contents

从命令行重启和关闭 Linux 系统

1. 概述

Linux 是一个非常强大的操作系统,因此,Linux 服务器很少需要重新启动。但是,有时我们确实需要重新启动系统。

例如,如果我们在个人电脑上运行 Linux,重启和关闭系统可能是日常操作。

在本教程中,我们将学习一些有用的命令来从命令行重启和关闭 Linux 系统。

2. 重启或关闭系统

有几个命令可以重新启动或关闭系统,例如*shutdown *、reboothaltpoweroff

由于重新启动或关闭系统将停止所有正在运行的进程,因此我们需要具有root权限才能执行这些命令。

大多数现代 Linux 发行版都采用*systemd 作为其系统和服务管理器。**在systemd管理的系统中,重新启动和关闭系统由systemctl 集中控制。*

例如,让我们在 Ubuntu 系统上检查这些命令:

$ file /sbin/{halt,poweroff,reboot,shutdown}
/sbin/halt:     symbolic link to /bin/systemctl
/sbin/poweroff: symbolic link to /bin/systemctl
/sbin/reboot:   symbolic link to /bin/systemctl
/sbin/shutdown: symbolic link to /bin/systemctl

得知所有这些命令都链接到同一个命令可能有点令人惊讶:systemctl。这是因为systemctl程序使用了一种技术来根据它的执行方式来改变它的行为。

在接下来的部分中,我们将仔细研究这些命令。

3. shutdown命令

我们可以使用shutdown命令安全地重启或关闭 Linux 系统。

使用shutdown命令的语法  很简单:

shutdown [OPTIONS...] [TIME] [MESSAGE]

当我们不带任何选项执行 shutdown时,它会在一分钟后关机:

root# date +'%F %T'
2020-04-04 20:55:43
root# shutdown
Shutdown scheduled for Sat 2020-04-04 20:56:50 CEST, use 'shutdown -c' to cancel.

如果普通用户已经配置为使用sudo获得root权限,我们也可以在不切换到root用户的情况下关闭机器 :

$ sudo shutdown

3.1. 常用选项

现在,让我们看一下shutdown命令支持的常用选项。

我们可以将-r*选项传递给它以重新启动我们的系统而不是关闭机器电源:*

root# shutdown -r
Shutdown scheduled for Sat 2020-04-04 21:56:50 CEST, use 'shutdown -c' to cancel.

** -H选项告诉 shutdown命令停止系统:**

root# shutdown -H
Shutdown scheduled for Sat 2020-04-04 21:56:50 CEST, use 'shutdown -c' to cancel.

停止系统和关闭机器电源略有不同:

  • halt:终止所有正在运行的进程并关闭所有CPU
  • power off:与halt相同,然后尝试切断系统电源

 3.2. 安排关机操作

有时我们不想在一分钟内关闭或重启系统。相反,我们可以在指定的时间安排关闭操作。

** shutdown命令 支持两种不同的时间格式进行调度:**

  • 绝对时间:HH:mm
  • 相对时间:+NumberOfMinutes

例如,我们可以安排在上午 8:08 重新启动系统:

root# shutdown -r 08:08
Shutdown scheduled for Sun 2020-04-05 08:08:00 CEST, use 'shutdown -c' to cancel.

让我们看另一个例子,我们安排系统在 30 分钟后关机:

root# shutdown +30
Shutdown scheduled for Sun 2020-04-04 22:28:00 CEST, use 'shutdown -c' to cancel.

如果我们想立即关闭系统,我们可以使用*+0*或一个方便的别名,now

root# shutdown now

由于 Linux 是一个多用户操作系统,我们可能希望向所有当前登录的用户广播有关计划关机或重启的消息:

root# shutdown -r +45 "Attention: This system will restart in 45 minutes!"
Shutdown scheduled for Sun 2020-04-04 22:48:00 CEST, use 'shutdown -c' to cancel.

我们可以 使用 -c 选项取消计划的关机过程

root# shutdown -c "Scheduled reboot is cancelled."

4. reboot、haltpoweroff命令

reboot 、haltpoweroff命令也可以重启或关闭我们的系统。 由于它们相似并且支持相同的选项,因此我们将从功能的角度来讨论这些命令。

4.1. 重启系统

我们可以使用reboot命令重启系统:

root# reboot

我们还可以将*–reboot选项传递给haltpoweroff*命令,让它们重启机器:

root# halt --reboot
root# poweroff --reboot

4.2. 停止机器

顾名思义,halt命令用于停止机器。我们可以简单地通过执行命令来停止一台机器:

root# halt

我们还可以将*–halt* 选项传递给rebootpoweroff命令,让它们停止机器:

root# reboot --halt
root# poweroff --halt

4.3. 关闭机器

当我们想要安全地关闭一台机器时,我们可以使用poweroff命令。没有任何参数,执行此命令将关闭机器电源:

root# poweroff

我们还可以将*-p* 选项传递给reboothalt命令,让它们停止系统并切断电源:

root# reboot -p
root# halt -p

4.4. -f选项

这三个命令都支持*-f*选项来强制重启、停止或关闭机器。

要理解 force 选项的含义,让我们仔细看看这三个命令的背景。

当我们在没有*-f选项的情况下执行这些命令时  ,它们将调用 带有适当选项的shutdown*工具。

例如在systemd系统中:

reboot 
--(invokes)--> shutdown -r now 
--(invokes)--> systemctl isolate reboot.target

上面命令中的reboot.target是systemctl的系统目标 。**系统目标中的一些预定义任务将由systemctl命令执行 ——例如,停止所有正在运行的进程、安全卸载已安装的设备等。

但是,如果我们将*-f* 选项传递给这三个命令,它们将不会调用 shutdown命令。相反,他们进行reboot() 系统调用以直接重启系统。

在 systemd系统中,命令 reboot -f 将调用 systemctl –force reboot.target–force选项 将使systemctl跳过系统目标并直接进行*reboot()*系统调用。

我们应该谨慎使用 -f 选项,因为这可能会导致数据丢失。