标签 关机 下的文章

作为一个工程师,我们经常与命令行打交道,但除了工作用的命令,你是否尝试过让命令来替代你生活中方方面面?

为了让更多的爱好者可以用命令行作为自己的有效工具,Linux 中国特别邀请了三位作者,撰写了《命令行生存指南》,希望可以通过这个系列的文章,让你换一个视角,来看待命令行的存在。如果你想体验一下不一样的命令行,那就不妨来看看今天的《命令行生存指南》。

本次的内容为试读内容,也欢迎你针对今天的内容提出自己的意见和建议。

操作概述

你会不会经常陷入这么一个情景:计划晚上早点睡叫,然而无奈总是一不小心玩过头了。你需要一种方法强制让你到时间了就要关机去睡觉了,这该怎么做呢?

Kgotobed 是一个很变态的内核模块。它会强制 Linux 在特定时间关闭,而你却毫无办法(即使你是 root 用户)。

概念和术语

内核模块允许 Linux 内核在运行时动态地向其中插入和删除代码。这些模块是具有独立功能的程序,可以被单独编译,但无法独立运行。模块在运行时作为内核的一部分在内核空间内运行。

操作实战

场景一:使用 Kgotobed 强制关机

难度★★★
演示发行版archlinux
涉及命令gotobed
安装

在 archlinux 上要安装 kgotobed,首先需要安装 dkmslinux-headers 这两个包:

sudo pacman -S dkms linux-headers --noconfirm

然后去 github 上克隆它的源代码:

git clone https://github.com/nikital/kgotobed.git

最后我们对源代码进行手工编译:

cd kgotobed/
sudo make install

make install 命令会完成以下三件事情:

  1. 通过 DKMS 注册 kgotobed.ko
  2. 安装 gotobed 命令到 /usr/local/bin
  3. 在 systemd 中注册、启用并运行 kgotobed.service
使用

直接运行 gotobed 就能看到设置的强行关机的时间:

[vagrant@archlinux kgotobed]$ gotobed 22:00
Current bedtime is 2018-04-13 01:00:00
Setting bedtime to 2018-04-12 22:00:00
Bedtime will be in 10 hours 32 minutes

不过你不能把时间调到更晚……

[vagrant@archlinux kgotobed]$ gotobed 2:00
Current bedtime is 2018-04-13 01:00:00
Error: Attempting to postpone bed time, it doesn't work like this...

要想调整默认时间,你需要修改 /etc/systemd/system/kgotobed.service

原始的 kgotobed.service 内容如下所示:

[Unit]
Description=kgotobed: Poweroff at bedtime
After=dkms.service

[Service]
Type=oneshot
ExecStartPre=/sbin/modprobe kgotobed
Environment=TIME=01:00
ExecStart=/usr/local/bin/gotobed -f ${TIME}

[Install]
WantedBy=multi-user.target

我们将其中的 TIME=01:00 改成 TIME=02:00 后重启系统,再次执行 gotobed 可以看到时间已经修改了:

[vagrant@archlinux ~]$ gotobed 
Current bedtime is 2018-04-13 02:00:00
删除 kgotobed

要逃脱强制关机的命运,几乎唯一的办法就是卸载 kgotobed 了。

我们可以在源代码目录中执行 make uninstall 进行卸载:

[vagrant@archlinux ~]$ cd kgotobed/
[vagrant@archlinux kgotobed]$ sudo make uninstall
dkms remove kgotobed/1.0 --all

-------- Uninstall Beginning --------
Module:  kgotobed
Version: 1.0
Kernel:  4.15.15-1-ARCH (x86_64)
-------------------------------------

Status: Before uninstall, this module version was ACTIVE on this kernel.

kgotobed.ko:
 - Uninstallation
   - Deleting from: /usr/lib/modules/4.15.15-1-ARCH/extra//
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.

depmod...........

DKMS: uninstall completed.

------------------------------
Deleting module version: 1.0
completely from the DKMS tree.
------------------------------
Done.
rm -f /usr/local/bin/gotobed
rm -f /etc/systemd/system/kgotobed.service
systemctl daemon-reload
[vagrant@archlinux kgotobed]$ 

小练习

请按照自己的需求更改强制关机的时间。

你的 Linux 系统关机时间太长么?以下是你可以采取的步骤,来找出导致延迟关机的原因并解决这个问题。

我希望你对 sigterm 和 sigkill 的概念有一点熟悉。

当你关闭 Linux 系统时,它会发送终止信号(sigterm),并礼貌地要求正在运行的进程停止。有些进程不符合该行为,它们会忽略终止信号并继续运行。

这可能会导致关机过程的延迟,因为你的系统会在一个预定义的时间段内等待运行的进程停止。在这个时间段之后,它会发送 kill 信号来强制停止所有剩余的运行进程并关闭系统。

事实上,在某些情况下,你会在黑屏上看到一个类似 “a stop job is running” 的信息。

如果你的系统关闭时间太长,你可以做以下工作:

  • 检查哪个进程/服务耗时过长,以及你是否能删除或重新配置它,使其正常运行。
  • 更改系统强制停止运行进程前的默认等待时间。(快速而不优雅的方式)

我的操作系统是使用 systemd 的 Ubuntu。这里的命令和步骤适用于任何使用 systemd 的 Linux 发行版(大多数发行版都是这样)。

检查哪些进程会导致 Linux 的长时间关机

如果你想找出问题所在,你应该检查上次关机时发生了什么。使用这个命令来获得“我知道你上个会话做了什么”(I Know What You Did Last Summer 的双关语)的力量。

journalctl -rb -1

journalctl 命令能让你读取系统日志。使用选项 -b -1 可以过滤最后一次启动会话的日志。使用选项 -r 时,日志将按时间倒序显示。

换句话说,journalctl -rb -1 命令将显示最后一次关闭 Linux 系统之前的系统日志。这里就是你需要分析 Linux 系统长时间关机问题的地方。

没有 journal 日志?下面是你应该做的。

如果没有 journal 日志,请确认你的发行版是否使用 systemd。

即使在一些使用 systemd 的 Linux 发行版上,journal 日志也没有被默认激活。

请确认 /var/log/journal 是否存在。如果不存在,请创建它:

sudo mkdir /var/log/journal

你还应该检查 /etc/systemd/journald.conf 文件的内容,并确保 Storage 的值被设置为自动(auto)或持久(persistent)。

你是否在日志中发现可疑的东西?是否有一个进程/服务拒绝停止?如果是,调查一下是否可以在没有副作用的情况下删除它,或者是否可以重新配置它。请不要在这里盲目地去删除东西。你应该对这个进程有所了解。

通过减少默认停止超时来加快 Linux 中的关机速度(快速修复)

关机的默认等待时间通常设置为 90 秒。在这个时间之后,你的系统会尝试强制停止服务。

如果你想让你的 Linux 系统快速关闭,你可以改变这个等待时间。

你可以在位于 /etc/systemd/system.conf 的配置文件中找到所有的 systemd 设置。这个文件中应该有很多以 # 开头的行。它们代表了文件中各条目的默认值。

在开始之前,最好先复制一份原始文件。

sudo cp /etc/systemd/system.conf /etc/systemd/system.conf.orig

在这里寻找 DefaultTimeoutStopSec。它可能被设置为 90 秒。

#DefaultTimeoutStopSec=90s

你得把这个值改成更方便的,比如 5 秒或 10 秒。

DefaultTimeoutStopSec=5s

如果你不知道如何在终端中编辑配置文件,可以使用这个命令在系统默认的文本编辑器(如 Gedit)中打开文件进行编辑:

sudo xdg-open /etc/systemd/system.conf

Change Shutdown Time Settings Ubuntu

不要忘记删除 DefaultTimeoutStopSec 前的 #。保存文件并重启系统。

这将帮助你减少 Linux 系统的关机延迟。

看门狗问题!

Linux 有一个名为看门狗的模块,用于监控某些服务是否在运行。它可以被配置为在系统因软件错误而挂起时自动重启系统。

在桌面系统上使用看门狗是不常见的,因为你可以手动关闭或重启系统。它经常被用于远程服务器上。

首先检查看门狗是否在运行:

ps -af | grep watch*

如果你的系统正在运行看门狗,你可以在 systemd 配置文件 /etc/systemd/system.conf 中将 ShutdownWatchdogSec 的值从 10 分钟改为更低的值。

你能解决关机时间过长的问题吗?

希望本教程能帮助你解决系统长时间关机的问题。如果你成功解决了这个问题,请在评论中告诉我。


via: https://itsfoss.com/long-shutdown-linux/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 管理员的日程当中,有很多需要执行的任务,其中就有系统的重启和关闭。

对于 Linux 管理员来说,重启和关闭系统是其诸多风险操作中的一例,有时候,由于某些原因,这些操作可能无法挽回,他们需要更多的时间来排查问题。

在 Linux 命令行模式下我们可以执行这些任务。很多时候,由于熟悉命令行,Linux 管理员更倾向于在命令行下完成这些任务。

重启和关闭系统的 Linux 命令并不多,用户需要根据需要,选择合适的命令来完成任务。

以下所有命令都有其自身特点,并允许被 Linux 管理员使用.

建议阅读:

系统重启和关闭之始,会通知所有已登录的用户和进程。当然,如果使用了时间参数,系统将拒绝新的用户登入。

执行此类操作之前,我建议您坚持复查,因为您只能得到很少的提示来确保这一切顺利。

下面陈列了一些步骤:

  • 确保您拥有一个可以处理故障的控制台,以防之后可能会发生的问题。 VMWare 可以访问虚拟机,而 IPMI、iLO 和 iDRAC 可以访问物理服务器。
  • 您需要通过公司的流程,申请修改或故障的执行权直到得到许可。
  • 为安全着想,备份重要的配置文件,并保存到其他服务器上.
  • 验证日志文件(提前检查)
  • 和相关团队交流,比如数据库管理团队,应用团队等。
  • 通知数据库和应用服务人员关闭服务,并得到确定答复。
  • 使用适当的命令复盘操作,验证工作。
  • 最后,重启系统。
  • 验证日志文件,如果一切顺利,执行下一步操作,如果发现任何问题,对症排查。
  • 无论是回退版本还是运行程序,通知相关团队提出申请。
  • 对操作做适当守候,并将预期的一切正常的反馈给团队

使用下列命令执行这项任务。

  • shutdownhaltpoweroffreboot 命令:用来停机、重启或切断电源
  • init 命令:是 “initialization” 的简称,是系统启动的第一个进程。
  • systemctl 命令:systemd 是 Linux 系统和服务器的管理程序。

方案 1:如何使用 shutdown 命令关闭和重启 Linux 系统

shutdown 命令用于断电或重启本地和远程的 Linux 机器。它为高效完成作业提供多个选项。如果使用了时间参数,系统关闭的 5 分钟之前,会创建 /run/nologin 文件,以确保后续的登录会被拒绝。

通用语法如下:

# shutdown [OPTION] [TIME] [MESSAGE]

运行下面的命令来立即关闭 Linux 机器。它会立刻杀死所有进程,并关闭系统。

# shutdown -h now
  • -h:如果不特指 -halt 选项,这等价于 -poweroff 选项。

另外我们可以使用带有 -halt 选项的 shutdown 命令来立即关闭设备。

# shutdown --halt now
或者
# shutdown -H now
  • -H, --halt:停止设备运行

另外我们可以使用带有 poweroff 选项的 shutdown 命令来立即关闭设备。

# shutdown --poweroff now
或者
# shutdown -P now
  • -P, --poweroff:切断电源(默认)。

如果您没有使用时间选项运行下面的命令,它将会在一分钟后执行给出的命令。

# shutdown -h
Shutdown scheduled for Mon 2018-10-08 06:42:31 EDT, use 'shutdown -c' to cancel.

[email protected]#
Broadcast message from [email protected] (Mon 2018-10-08 06:41:31 EDT):

The system is going down for power-off at Mon 2018-10-08 06:42:31 EDT!

其他的登录用户都能在中断中看到如下的广播消息:

[[email protected] ~]$
Broadcast message from [email protected] (Mon 2018-10-08 06:41:31 EDT):

The system is going down for power-off at Mon 2018-10-08 06:42:31 EDT!

对于使用了 -halt 选项:

# shutdown -H
Shutdown scheduled for Mon 2018-10-08 06:37:53 EDT, use 'shutdown -c' to cancel.

[email protected]#
Broadcast message from [email protected] (Mon 2018-10-08 06:36:53 EDT):

The system is going down for system halt at Mon 2018-10-08 06:37:53 EDT!

对于使用了 -poweroff 选项:

# shutdown -P
Shutdown scheduled for Mon 2018-10-08 06:40:07 EDT, use 'shutdown -c' to cancel.

[email protected]#
Broadcast message from [email protected] (Mon 2018-10-08 06:39:07 EDT):

The system is going down for power-off at Mon 2018-10-08 06:40:07 EDT!

可以在您的终端上敲击 shutdown -c 选项取消操作。

# shutdown -c

Broadcast message from [email protected] (Mon 2018-10-08 06:39:09 EDT):

The system shutdown has been cancelled at Mon 2018-10-08 06:40:09 EDT!

其他的登录用户都能在中断中看到如下的广播消息:

[[email protected] ~]$
Broadcast message from [email protected] (Mon 2018-10-08 06:41:35 EDT):

The system shutdown has been cancelled at Mon 2018-10-08 06:42:35 EDT!

添加时间参数,如果你想在 N 秒之后执行关闭或重启操作。这里,您可以为所有登录用户添加自定义广播消息。例如,我们将在五分钟后重启设备。

# shutdown -r +5 "To activate the latest Kernel"
Shutdown scheduled for Mon 2018-10-08 07:13:16 EDT, use 'shutdown -c' to cancel.

[root@vps138235 ~]#
Broadcast message from [email protected] (Mon 2018-10-08 07:08:16 EDT):

To activate the latest Kernel
The system is going down for reboot at Mon 2018-10-08 07:13:16 EDT!

运行下面的命令立即重启 Linux 机器。它会立即杀死所有进程并且重新启动系统。

# shutdown -r now
  • -r, --reboot: 重启设备。

方案 2:如何通过 reboot 命令关闭和重启 Linux 系统

reboot 命令用于关闭和重启本地或远程设备。reboot 命令拥有两个实用的选项。

它能够优雅的关闭和重启设备(就好像在系统菜单中惦记重启选项一样简单)。

执行不带任何参数的 reboot 命令来重启 Linux 机器。

# reboot

执行带 -p 参数的 reboot 命令来关闭 Linux 机器电源。

# reboot -p
  • -p, --poweroff:调用 haltpoweroff 命令,切断设备电源。

执行带 -f 参数的 reboot 命令来强制重启 Linux 设备(这类似按压机器上的电源键)。

# reboot -f
  • -f, --force:立刻强制中断,切断电源或重启。

方案 3:如何通过 init 命令关闭和重启 Linux 系统

init(“initialization” 的简写)是系统启动的第一个进程。

它将会检查 /etc/inittab 文件并决定 linux 运行级别。同时,允许用户在 Linux 设备上执行关机或重启操作. 这里存在从 06 的七个运行等级。

建议阅读:

执行以下 init 命令关闭系统。

# init 0
  • 0: 停机 – 关闭系统。

运行下面的 init 命令重启设备:

# init 6
  • 6:重启 – 重启设备。

方案 4:如何通过 halt 命令关闭和重启 Linux 系统

halt 命令用来切断电源或关闭远程 Linux 机器或本地主机。 中断所有进程并关闭 cpu。

# halt

方案 5:如何通过 poweroff 命令关闭和重启 Linux 系统

poweroff 命令用来切断电源或关闭远程 Linux 机器或本地主机。 poweroff 很像 halt,但是它可以关闭设备硬件(灯和其他 PC 上的其它东西)。它会给主板发送 ACPI 指令,然后信号发送到电源,切断电源。

# poweroff

方案 6:如何通过 systemctl 命令关闭和重启 Linux 系统

systemd 是一款适用于所有主流 Linux 发型版的全新 init 系统和系统管理器,而不是传统的 SysV init 系统。

systemd 兼容与 SysV 和 LSB 初始化脚本。它能够替代 SysV init 系统。systemd 是内核启动的第一个进程,并持有序号为 1 的进程 PID。

建议阅读:

它是一切进程的父进程,Fedora 15 是第一个适配安装 systemd (替代了 upstart)的发行版。

systemctl 是命令行下管理 systemd 守护进程和服务的主要工具(如 startrestartstopenabledisablereload & status)。

systemd 使用 .service 文件而不是 SysV init 使用的 bash 脚本。 systemd 将所有守护进程归与自身的 Linux cgroups 用户组下,您可以浏览 /cgroup/systemd 文件查看该系统层次等级。

# systemctl halt
# systemctl poweroff
# systemctl reboot
# systemctl suspend
# systemctl hibernate

via: https://www.2daygeek.com/6-commands-to-shutdown-halt-poweroff-reboot-the-linux-system/

作者:Prakash Subramanian 选题:lujun9972 译者:cyleft 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我知道熬夜对健康不利。但谁在乎?多年来我一直是一只夜猫子。我通常在 12 点以后睡觉,有时在凌晨 1 点以后睡觉。第二天早上,我至少推迟三次闹钟,醒来后又累又有脾气。每天,我向自己保证早点睡觉,但最终会像平常一样晚睡。而且,这个循环还在继续!如果你和我一样,这有一个好消息。一个同学通宵开发了一个名为 “Kgotobed” 的内核模块,它迫使你在特定的时间上床睡觉。也就是说它会强制关闭你的系统。

你可能会问!我为什么要用这个?我有很多其他的选择。我可以设置一个 cron 作业来安排在特定时间关闭系统。我可以设置提醒或闹钟。我可以使用浏览器插件或软件。但是,它们都可以轻易忽略或绕过。Kgotobed 是你不能忽视的东西。即使您是 root 用户也无法禁用。是的,它会在指定的时间强制关闭你的系统。没有推迟选项。你不能推迟关机过程,也不能取消它。无论如何,系统都会在指定的时间停止运行。你被警告了!!

安装 Kgotobed

确保你已经安装了 dkms。它在大多数 Linux 发行版的默认仓库中都有。

例如在 Fedora 上,你可以使用以下命令安装它:

$ sudo dnf install kernel-devel-$(uname -r) dkms

在 Debian、Ubuntu、linux Mint 上:

$ sudo apt install dkms

安装完成后,git clone Kgotobed 项目。

$ git clone https://github.com/nikital/kgotobed.git

该命令会在当前工作目录中将所有 Kgotobed 仓库的内容克隆到名为 kgotobed 的文件夹中。进入到该目录:

$ cd kgotobed/

接着,使用命令安装 Kgotobed 驱动:

$ sudo make install

上面的命令将 kgotobed.ko 模块注册到 DKMS(这样它会为每个你运行的内核重建)并在 /usr/local/bin/ 目录下安装 gotobed,然后注册、启用并启动 kgotobed 服务。

如何运行

默认情况下,Kgotobed 将睡前时间设置为 1:00 AM。也就是说,无论你在做什么,你的电脑都会在凌晨 1 点关机。

要查看当前的睡前时间,请运行:

$ gotobed
Current bedtime is 2018-04-10 01:00:00

要提前睡眠时间,例如 22:00(晚上 10 点),请运行:

$ sudo gotobed 22:00
[sudo] password for sk:
Current bedtime is 2018-04-10 00:58:00
Setting bedtime to 2018-04-09 22:00:00
Bedtime will be in 2 hours 16 minutes

当你想早点睡觉时,这会很有帮助!

但是,你不能设置更晚的时间也就是凌晨 1 点以后。你无法卸载模块,并且调整系统时钟也无济于事。唯一的出路是重启!

要设置不同的默认时间,您需要自定义 kgotobed.service(通过编辑或使用 systemd 工具)。

卸载 Kgotobed

对 Kgotobed 不满意?别担心!进入我们先前克隆的 kgotobed 文件夹,然后运行以下命令将其卸载。

$ sudo make uninstall

再一次,我警告你,即使你是 root 用户,也没有办法推迟或取消关机过程。你的系统将在指定的时间强制关闭。这并不适合每个人!当你在做一项重要任务时,它可能会让你疯狂。在这种情况下,请确保你已经不时地保存工作,或使用下面链接中的一些高级工具来帮助你在特定时间自动关闭、重启、暂停和休眠系统。

就是这些了。希望你觉得这个指南有帮助。还有更好的东西。敬请关注!

干杯!

资源


via: https://www.ostechnix.com/kgotobed-a-kernel-module-that-forcibly-shutdown-your-system/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我去!又是这样。 我还以为我登录到家里的服务器呢。 结果 重启的居然是数据库服务器。 另外我也有时会在错误终端内输入 “shutdown -h 0” 命令。 我知道有些人 经常会犯这个错误

我的愤怒无从容忍

有办法解决这个问题吗?我真的只能忍受这种随机重启和关机的痛苦吗? 虽说人总是要犯错的,但总不能一错再错吧。

最新我在 tweet 上发了一通牢骚:

我总是一遍又一遍地犯下同样的错误 :( 本来应该输入: sudo virsh reboot d1

却总是输错重启了自己的电脑 sudo reboot d1

-- nixCraft (@nixcraft) February 19,2017

结果收到了一些建议。我们来试一下。

向你引荐 molly guard

Molly-Guard 尝试阻止你不小心关闭或重启 Linux 服务器。它在 Debian/Ubuntu 中的包描述为:

这个包会安装一个 shell 脚本来屏蔽现有的 shutdown/reboot/halt/poweroff/coldreboot/pm-hibernate/pm-suspend* 命令。 molly-gurad 会首先运行一系列的脚本,只有在所有的脚本都返回成功的条件下, 才会调用真正的命令。 其中一个脚本会检查是否存在 SSH 会话。 如果是通过 SSH 会话调用的命令, shell 脚本会提示你输入相关闭主机的名称。 这应该足够防止你发生意外的关机或重启了。

貌似 molly-guard 还是个 专有名词 Jargon File

一种用于防止由于笨拙或者不小心触碰道大红开关的屏障。最初指的临时盖在 IBM 4341 的大红按钮上的有机玻璃,因为有一个程序员蹒跚学步的女儿(名叫 Molly)一天之内重启了它两次。 后来这个东西也被用来盖住磁盘和网络设备上的停止/重启按钮。在硬件目录中,你很少会看到 “guarded button” 这样无趣的描述"。

如何安装 molly guard

使用 apt-get 命令 或者 apt 命令 来搜索并安装 molly-guard:

$ apt search molly-guard
$ sudo apt-get install molly-guard

结果为:

Fig.01: Installing molly guard on Linux

测试一下

输入 reboot 命令shutdown 命令:

$ sudo reboot
# reboot
$ shutdown -h 0
# sudo shutdown -h 0
### running wrong command such as follows instead of
### sudo virsh reboot vm_name_here
$ sudo reboot vm_name_here

结果为:

Fig.02: Molly guard saved my butt ;)

我超级喜欢 molly-guard。因此我将下行内容加入到 apt-debian-ubuntu-common.yml 文件中了:

 - apt:
 name: molly-guard

是的。我使用 Ansible 在所有的 Debian 和 Ubuntu 服务器上都自动安装上它了。

相关我的 10 大 UNIX 命令行错误

如果我的 Linux 发行版或者 Unix 系统(比如 FreeBSD) 没有 molly-guard 怎么办呢?

不用怕,设置 shell 别名

## bash shell example ###
alias reboot = "echo 'Are you sure?' If so, run /sbin/reboot"
alias shutdown = "echo 'Are you sure?' If so, run /sbin/shutdown"

你也可以 临时取消别名机制运行真正的命令。比如要运行 reboot 可以这样:

# \reboot

或者

# /sbin/reboot

另外你也可以写一个 shell/perl/python 脚本来调用这些命令并要求 确认 reboot/halt/shutdown 的选项。


via: https://www.cyberciti.biz/hardware/how-to-protects-linux-and-unix-machines-from-accidental-shutdownsreboots-with-molly-guard/

作者:Vivek Gite 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

timekeeper

了解如何通过配置 Linux 计算机来根据时间自动唤醒和关闭。

不要成为一个电能浪费者。如果你的电脑不需要开机就请把它们关机。出于方便和计算机宅的考虑,你可以通过配置你的 Linux 计算机实现自动唤醒和关闭。

宝贵的系统运行时间

有时候有些电脑需要一直处在开机状态,在不超过电脑运行时间的限制下这种情况是被允许的。有些人为他们的计算机可以长时间的正常运行而感到自豪,且现在我们有内核热补丁能够实现只有在硬件发生故障时才需要机器关机。我认为比较实际可行的是,像减少移动部件磨损一样节省电能,且在不需要机器运行的情况下将其关机。比如,你可以在规定的时间内唤醒备份服务器,执行备份,然后关闭它直到它要进行下一次备份。或者,你可以设置你的互联网网关只在特定的时间运行。任何不需要一直运行的东西都可以将其配置成在其需要工作的时候打开,待其完成工作后将其关闭。

系统休眠

对于不需要一直运行的电脑,使用 root 的 cron 定时任务(即 /etc/crontab)可以可靠地关闭电脑。这个例子创建一个 root 定时任务实现每天晚上 11 点 15 分定时关机。

# crontab -e -u root
# m h  dom mon dow   command
15 23 * * * /sbin/shutdown -h now

以下示例仅在周一至周五运行:

15 23 * * 1-5 /sbin/shutdown -h now

您可以为不同的日期和时间创建多个 cron 作业。 通过命令 man 5 crontab 可以了解所有时间和日期的字段。

一个快速、容易的方式是,使用 /etc/crontab 文件。但这样你必须指定用户:

15 23 * * 1-5 root shutdown -h now

自动唤醒

实现自动唤醒是一件很酷的事情;我大多数 SUSE (SUSE Linux)的同事都在纽伦堡,因此,因此为了跟同事能有几小时一起工作的时间,我不得不需要在凌晨五点起床。我的计算机早上 5 点半自动开始工作,而我只需要将自己和咖啡拖到我的桌子上就可以开始工作了。按下电源按钮看起来好像并不是什么大事,但是在每天的那个时候每件小事都会变得很大。

唤醒 Linux 计算机可能不如关闭它可靠,因此你可能需要尝试不同的办法。你可以使用远程唤醒(Wake-On-LAN)、RTC 唤醒或者个人电脑的 BIOS 设置预定的唤醒这些方式。这些方式可行的原因是,当你关闭电脑时,这并不是真正关闭了计算机;此时计算机处在极低功耗状态且还可以接受和响应信号。只有在你拔掉电源开关时其才彻底关闭。

BIOS 唤醒

BIOS 唤醒是最可靠的。我的系统主板 BIOS 有一个易于使用的唤醒调度程序 (图 1)。对你来说也是一样的容易。

wakeup

图 1:我的系统 BIOS 有个易用的唤醒定时器。

主机远程唤醒(Wake-On-LAN)

远程唤醒是仅次于 BIOS 唤醒的又一种可靠的唤醒方法。这需要你从第二台计算机发送信号到所要打开的计算机。可以使用 Arduino 或 树莓派 Raspberry Pi 发送给基于 Linux 的路由器或者任何 Linux 计算机的唤醒信号。首先,查看系统主板 BIOS 是否支持 Wake-On-LAN ,要是支持的话,必须先启动它,因为它被默认为禁用。

然后,需要一个支持 Wake-On-LAN 的网卡;无线网卡并不支持。你需要运行 ethtool 命令查看网卡是否支持 Wake-On-LAN :

# ethtool eth0 | grep -i wake-on
        Supports Wake-on: pumbg
        Wake-on: g

这条命令输出的 “Supports Wake-on” 字段会告诉你你的网卡现在开启了哪些功能:    

  • d -- 禁用
  • p -- 物理活动唤醒
  • u -- 单播消息唤醒
  • m -- 多播(组播)消息唤醒
  • b -- 广播消息唤醒
  • a -- ARP 唤醒
  • g -- 特定数据包 magic packet 唤醒
  • s -- 设有密码的 特定数据包 magic packet 唤醒

ethtool 命令的 man 手册并没说清楚 p 选项的作用;这表明任何信号都会导致唤醒。然而,在我的测试中它并没有这么做。想要实现远程唤醒主机,必须支持的功能是 g —— 特定数据包 magic packet 唤醒,而且下面的“Wake-on” 行显示这个功能已经在启用了。如果它没有被启用,你可以通过 ethtool 命令来启用它。

# ethtool -s eth0 wol g

这条命令可能会在重启后失效,所以为了确保万无一失,你可以创建个 root 用户的定时任务(cron)在每次重启的时候来执行这条命令。

@reboot /usr/bin/ethtool -s eth0 wol g

另一个选择是最近的 网络管理器 Network Manager 版本有一个很好的小复选框来启用 Wake-On-LAN(图 2)。

wakeonlan

图 2:启用 Wake on LAN

这里有一个可以用于设置密码的地方,但是如果你的网络接口不支持 安全开机 Secure On 密码,它就不起作用。

现在你需要配置第二台计算机来发送唤醒信号。你并不需要 root 权限,所以你可以为你的普通用户创建 cron 任务。你需要用到的是想要唤醒的机器的网络接口和MAC地址信息。

30 08 * * * /usr/bin/wakeonlan D0:50:99:82:E7:2B 

RTC 唤醒

通过使用实时闹钟来唤醒计算机是最不可靠的方法。对于这个方法,可以参看 Wake Up Linux With an RTC Alarm Clock ;对于现在的大多数发行版来说这种方法已经有点过时了。

下周继续了解更多关于使用 RTC 唤醒的方法。

通过 Linux 基金会和 edX 可以学习更多关于 Linux 的免费 Linux 入门教程。

(题图:The Observatory at Delhi


via:https://www.linux.com/learn/intro-to-linux/2017/11/wake-and-shut-down-linux-automatically

作者:Carla Schroder 译者:HardworkFish 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出