使用 Linux 看门狗定时器

使用 Linux 看门狗定时器

我在桌面上运行 Ubuntu 18.04,我通过 xRDP(有时还通过 SSH)远程连接到该桌面。该计算机位于医院实验室,我使用 VPN 连接到该计算机。在没有警告或模式的情况下,当我通过 RDP 连接进行编程时,桌面将在 RDP 上冻结,并且我将无法通过 SSH 登录(几乎每次)。这迫使我在对新冠病毒的担忧中前往实验室,而实验室本应关闭。 :/

然而,最近一次,我的 SSH 在冻结后再次连接。我输入的内容的响应时间延迟了 30 秒以上。我看到了以下内容:

Last login: Wed Mar  4 16:01:39 2020 from 111.11.1.111
htop
^CFailed to import the site module
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
^Ctop
user:~$ top
^C
^C
^C^C^C
user:~$ Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "/usr/lib/python3.6/io.py", line 52, in <module>
^C
user:~$ top
^C
user:~$ sudo reboot
    import abc
  File "/usr/lib/python3.6/abc.py", line 6, in <module>
    from _weakrefset import WeakSet
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "/usr/lib/python3.6/io.py", line 52, in <module>Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "/usr/lib/python3.6/io.py", line 52, in <module>  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
^A^C^C  File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 577, in module_from_spec
  File "<frozen importlib._bootstrap>", line 556, in _init_module_attrs
  File "<frozen importlib._bootstrap>", line 409, in cached
  File "<frozen importlib._bootstrap_external>", line 364, in _get_cached
  File "<frozen importlib._bootstrap_external>", line 294, in cache_from_source
^C^CKeyboardInterrupt
[sudo] password for user:

user:~$ uptime
 00:46:27 up 2 days,  2:22,  1 user,  load average: 190.28, 185.42, 162.91
user:~$ sudo reboot -f

尝试运行top以查看正在运行的内容,但没有返回任何结果。我看到uptime显示出令人难以置信的高负载,这可能解释了 SSH 命令的延迟。

  1. 我如何知道发生了什么?
  2. 有没有办法远程强制重启?我知道我可以发送 WoL 数据包以将其从睡眠状态启动,但我认为没有任何东西可以重启。即使只有一行代码,我也可以设置并通过 SSH 连接到盒子并等待它最终被执行。此时我几乎想安装一个 Pi 来切换电源,或者使用 UPS 进行远程控制。

答案1

使用 Linux 看门狗定时器

还有第三步:

  1. sudo apt 安装看门狗

  2. sudo gedit /etc/watchdog.conf

    通过从行开头max-load删除 来取消注释引用 的行。#保存并退出。

  3. sudo systemctl 重新启动看门狗

您的机器现在受到 Linux 看门狗的保护,并且会在下次负载过高时自动重新启动。

解释

您可以使用看门狗定时器内置于 Linux 内核中,可在出现问题时自动重新启动。设置后,看门狗定时器将倒计时,如果在为零之前未重置,则将重新启动系统。因此,您只需要一些可以定期重置计时器的东西:输入看门狗守护进程

sudo apt install watchdog

这会安装 watchdogd,一个用户空间守护进程,它会进行一些测试以确保系统正常并告诉内核计时器再睡 60 秒。如果这些测试失败或花费的时间超过 60 秒,系统将重新启动。

它是非常可配置的。只需编辑/etc/watchdog.conf.例如,这里有一个节(默认情况下被注释掉),它将检测到您报告的 190 的极高平均负载:

# Uncomment to enable test. Setting one of these values to '0' disables it.
# These values will hopefully never reboot your machine during normal use
# (if your machine is really hung, the loadavg will go much higher than 25)
#max-load-1             = 24
#max-load-5             = 18
#max-load-15            = 12

进一步阅读

注意:不要担心“硬件”与“软件”看门狗。 Linux 内核中内置的软件看门狗的可靠性仅比硬件看门狗稍差一些。在您的情况下,平均负载非常高,软件看门狗就足够了。

相关内容