几乎每次我关闭计算机时都会出现以下消息:
A stop job is running for Session c2 of user ... (1min 30s)
Run Code Online (Sandbox Code Playgroud)
它等待 1 分 30 秒,然后继续关闭过程。我按照这个systemd关机诊断指南得到了shutdown-log.txt(我不能在这里直接粘贴日志,因为它很长)。不幸的是,我自己不理解日志。谁能帮我找出是什么导致我的系统无法正常关闭?
我用内核运行 Arch Linux 4.4.5-1-ARCH,我的systemd版本是229-3.
附加 1:我观察到每次注销,然后从登录屏幕关闭我的计算机时,它都没有收到消息A stop job is running...。我多次尝试在关机前注销,所以我认为这不是偶然发生的。希望这些信息能有所帮助。
附加 2:始终是会话 c2 导致关闭挂起。因此,正如@n.st 所建议的那样,我再次查看了诊断关机问题并存储loginctl session-status c2而不是dmesg,但是shutdown-log.txt. 我替换loginctl session-status c2为systemd-cgls并得到以下日志:
Control group /:
-.slice
??init.scope
?? 1 /usr/lib/systemd/systemd-shutdown reboot --log-level 6 --log-target ...
??1069 /usr/lib/systemd/systemd-shutdown reboot …Run Code Online (Sandbox Code Playgroud) 有时,当我想快速注销时,我会这样做kill -15 -1。我注意到 bash 忽略了 SIGTERM。
我想知道这种 bash 行为的理由是什么?
没有充分理由就忽略 SIGTERM 不是很 UNIX,不是吗?
更新:
对所有人都有相同(无)效果:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
Run Code Online (Sandbox Code Playgroud)
更新2:
从人 bash:
当 bash 是交互式的,在没有任何陷阱的情况下,它会忽略 SIGTERM
所以这是故意的。但为什么?
我尝试通过远程会话启动一个 shell 脚本,它使用命令在后台启动一个进程。
nohup python3 run.py > nohup.out &
Run Code Online (Sandbox Code Playgroud)
当远程会话关闭时,进程会被以下消息杀死:
捕获信号SIGHUP
SIGHUP 被捕获但没有被守护。退出。
我不明白;为什么进程在使用nohup &在后台启动时被杀死?
我通过更改GRUB_CMDLINE_LINUX/etc/default/grub 中的行来禁用可预测的网络接口名称:
GRUB_CMDLINE_LINUX="pci=nomsi"
Run Code Online (Sandbox Code Playgroud)
到:
GRUB_CMDLINE_LINUX="pci=nomsi net.ifnames=0"
Run Code Online (Sandbox Code Playgroud)
在安装了专有 NVIDIA 驱动程序的全新 Debian GNU/Linux 测试系统上。我这样做是因为我的外部 USB Wi-Fi 卡不能使用 systemd 接口名称。
禁用可预测的网络接口名称后,我在启动时给出以下消息:
正在运行提升网络接口的启动作业(2 分 5 分 1 秒)
和系统启动时间长。
我的/etc/network/intefaces文件:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
Run Code Online (Sandbox Code Playgroud)
为什么我在启动时给出这个消息?如何避免系统长时间启动?
通常当我关闭我的机器时(使用shutdown命令)它工作得非常快,但每隔一段时间,通常是在一个无聊的更新之后或者当我破坏某些服务的配置文件时,我最终会得到
正在为 Some Broken Service 运行停止作业(20 分钟 58 秒/无限制)
在我的屏幕上游行,直到我屈服并按住电源按钮直到机器关闭。有时有多个作业,其中一个实际挂起,而其他作业则在等待挂起的作业,每个作业 1:30 的超时加起来长达 20-30 分钟。有时它会在经过大量等待后最终关闭,有时则不会(或者我没有耐心)。
当我发现这会强制终止挂起的任何内容并允许它继续(半)正常关闭时,我能做些什么吗?主要是,我想确保btrfs总是有机会重新挂载-ro 和刷新到磁盘,因为我正在运行(半不稳定)raid6。我听说 Ctrl+Alt+Delete 应该有帮助,但它似乎所做的只是^[[3~在我的屏幕底部打印——我需要做些什么来启用它吗?
需要明确的是,我并没有尝试全局关闭或禁用此超时——我的系统通常能够在不运行的情况下关闭——我只是想要一种在发现问题时以交互方式绕过它的方法。此外,对为什么会发生这种情况或如何解决它不感兴趣——诊断必须等到机器完成关闭并重新启动。
我最近一次遇到这个问题是编写了一个 udev 规则,导致内核崩溃,systemd-udev据我所知导致永久挂起。出于某种原因,这意味着 docker 挂了 30 分钟,直到关闭本身超时。
当我有一个 systemd.mount单元指向 NFS 共享时,它似乎也经常发生,当 VPN 已死时,只能通过 VPN 访问。停止安装单元将永远挂起,由于某种原因导致我的用户会话和其他 6-8 个单元每个(按顺序)挂起 1:30,直到它们全部超时。
也曾经发生过一段时间我由于某种莫名其妙的原因关闭,然后通过内核升级修复(5.7.something修复它,如果我没记错的话)。
关机时经常会显示这样的消息:
"A stop job is running ..." (nfs mount)
Run Code Online (Sandbox Code Playgroud)
这显然即使发生在NFS服务器并没有消失。但即使与 NFS 服务器的连接丢失,systemd 也能有效地防止系统关闭。无法再通过 ssh 进入系统,也无法切换到另一个 tty。点击Ctrl+ Alt+F2确实会切换到带有光标的黑屏,但没有登录提示。用户被迫强制重新启动系统,从而冒着仍然挂载的文件系统上的数据损坏的风险。
那个时候关机过程中如何启用tty控制台登录?
应该可以以 root 身份登录并执行umount -l或执行任何可能需要的操作,以允许系统正常继续关闭过程。
(这个问题不是关于 NFS,它只是一个常见的例子。如果服务器消失了,NFS 挂载实际上会按设计挂起。这个问题是关于这样一个事实,即虽然这个“停止作业”阻止了关闭过程,但它不是可以登录并输入命令来处理这种情况。)
我试图阻止用户在不从机器上物理移除闪存卡的情况下关闭或重新启动。为此,我编写了一个 SystemD 服务,removeflash.service:
[Unit]
Description=Prompt user to remove flash card
[Service]
ExecStop=/usr/lib/systemd/flashshutdown.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Requires=rsyslog.service
Run Code Online (Sandbox Code Playgroud)
flashshutdown.sh是一个bash脚本,如下:
#! /bin/bash
#
while [ -e /dev/flash ] ; do
echo "Please remove flash card"
logger "GHB: Please remove flash card"
sleep 5
done
Run Code Online (Sandbox Code Playgroud)
我没想到 echo 在关闭时会做任何事情,而且它没有。但是,我希望 logger 命令能够工作。没有Requires=rsyslog.service,我的服务在rsyslog.service关闭后就退出了;我插入了防止这种情况发生的要求,但唯一的区别是,removeflash.service 的关闭在关闭顺序中较早。幸运的是,systemd 本身向控制台输出一条消息,表明它正在运行提示用户删除闪存卡的作业,这一事实挽救了该服务的目的。
向控制台发出消息的正确方法是什么?