系统调用中挂起的挂起作业的正常关闭

系统调用中挂起的挂起作业的正常关闭

当我昨天暂停系统时,作业并没有终止,systemd-suspend.service从那时起我就有一个作业处于不间断的睡眠状态:

# systemctl list-jobs
  JOB UNIT                    TYPE  STATE  
21595 post-resume.target      start waiting
21593 systemd-suspend.service start running
21592 suspend.target          start waiting
21596 post-resume.service     start waiting

# systemctl status systemd-suspend.service
● systemd-suspend.service - Suspend
   Loaded: loaded (/nix/store/2jspk70lir7jcn1krax8haw2j7486i3a-systemd-243.3/example/systemd/system/systemd-suspend.se>
   Active: activating (start) since Sat 2020-04-04 03:07:36 CEST; 23h ago
     Docs: man:systemd-suspend.service(8)
 Main PID: 16761 (systemd-sleep)
       IP: 0B in, 0B out
    Tasks: 1 (limit: 4915)
   Memory: 1.0M
      CPU: 20ms
   CGroup: /system.slice/systemd-suspend.service
           └─16761 /nix/store/2jspk70lir7jcn1krax8haw2j7486i3a-systemd-243.3/lib/systemd/systemd-sleep suspend

Apr 04 03:07:36 phlegethon systemd[1]: Starting Suspend...
Apr 04 03:07:36 phlegethon systemd-sleep[16761]: Suspending system...

# ps aux |grep suspend
root     16761  0.0  0.0  10364  2052 ?        Ds   Apr04   0:00 /nix/store/2jspk70lir7jcn1krax8haw2j7486i3a-systemd-243.3/lib/systemd/systemd-sleep suspend

当我尝试手动触发挂起时,内核(5.4.14)回答 EBUSY:

# echo mem >/sys/power/state
-bash: echo: write error: Device or resource busy

看起来内核在同步其中一个磁盘时卡住了:

# cat /proc/16761/stack
[<0>] iterate_bdevs+0x98/0x142
[<0>] ksys_sync+0x6e/0xb0
[<0>] ksys_sync_helper+0x13/0x90
[<0>] pm_suspend.cold.8+0x213/0x361
[<0>] state_store+0x80/0xe0
[<0>] kernfs_fop_write+0xc1/0x1a0
[<0>] vfs_write+0xa5/0x1a0
[<0>] ksys_write+0x59/0xd0
[<0>] do_syscall_64+0x4e/0x120
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

现在,在这种状态下,我甚至似乎无法正常关闭机器:

# systemctl poweroff
Failed to power off system via logind: There's already a shutdown or sleep operation in progress

那我该怎么办?我很想伸手去拿大枪(Sysrq),但我想知道它是否真的有效?sync(1)正如预期的那样,只是挂起,所以我不愿意尝试。

另外,有没有办法查到哪个内核正在等待的磁盘设备?我有点希望它只是一些 USB 设备,没什么大不了的。

答案1

我知道这并不能完全回答问题,但也许会有所帮助。
您或其他将阅读本文的人。

我现在有(或仍然有)类似的问题。挂起作业未完成返回到系统并挂起作业。

24913 systemd-suspend.service start running
24912 suspend.target          start waiting

当我尝试继续时,我收到了与您相同的消息。

# systemctl suspend
Failed to suspend system via logind: There's already a shutdown or sleep operation in progress


我的目标是暂停,而不是关闭。这就是我所做的。

# systemctl cancel
# systemctl stop systemd-suspend.service

首先,停止悬挂操作。
其次,导致系统立即挂起。

取消后我尝试暂停systemctl suspend,但结果又遇到同样的问题。
醒来后我启动了服务,系统又暂停了。

希望我现在能够在没有此解决方法的情况下暂停。

答案2

我遇到了类似的问题。我花了一天多的时间来寻找我案件的根本原因。幸运的是,这是 Ubuntu 20.04 仅几周前的安装,因此它接近于全新安装。

对我来说,登录显示管理器后,NetworkManager 没有运行或重新启动等(与默认值相同),因此我无法访问 WiFi。

我还看到了与上面提到的等效内容:

# systemctl list-jobs
  JOB UNIT                    TYPE  STATE  
21593 systemd-suspend.service start running

使用它systemctl cancel 21593会停止工作并解决问题,这表明这确实是问题所在。

man systemd-sleep发现

在进入系统挂起和/或休眠之前,systemd-suspend.service(以及其他提到的单元)将运行 /lib/systemd/system-sleep/ 中的所有可执行文件...此目录中的所有可执行文件都是并行执行的,并且在所有可执行文件完成之前不会继续执行该操作。

因此,经过检查,/lib/systemd/system-sleep我意识到它包含tlp我最近刚刚安装的脚本。我使用卸载了 tlp 和关联的软件包

sudo apt --purge remove tlp tlpui tlp-rdw

问题就完全消失了。

相关内容