关于 systemd-inhibit 的误解

关于 systemd-inhibit 的误解

我做了一个实验。我使用 K3b 将 iso 刻录到 CD-RW 上。在此过程中,我发出了 systemctl suspend

计算机确实暂停了。

我误会了吗systemd-inhibit

我看了这个,不确定它是否有帮助。

如何暂时禁止暂停?

  systemd-inhibit may be used to execute a program with a shutdown, sleep, or idle inhibitor
       lock taken. The lock will be acquired before the specified command line is executed and
       released afterwards.

       Inhibitor locks may be used to block or delay system sleep and shutdown requests from the
       user, as well as automatic idle handling of the OS. This is useful to avoid system
       suspends while an optical disc is being recorded, or similar operations that should not be
       interrupted.

答案1

我遇到了同样的问题 - 调用命令后,systemd-inhibit我的笔记本电脑成功进入睡眠状态。我还没有找到解决这个问题的方法,但我有一个很好的解决方法。(我正在使用 archlinux,但我相信它在大多数情况下都应该能工作。)

主要思想是包装实现睡眠功能的主要服务(二进制或脚本)。

1. 找到主服务

$ systemctl status systemd-suspend.service
○ systemd-suspend.service - System Suspend
     Loaded: loaded (/usr/lib/systemd/system/systemd-suspend.service; static)

检查内容/usr/lib/systemd/system/systemd-suspend.service

$ cat /usr/lib/systemd/system/systemd-suspend.service
...
[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/systemd-sleep suspend

最终获胜者是/usr/lib/systemd/systemd-sleep。请注意,它消耗一个参数,因此包装器脚本不应丢失它。作为奖励,我们将在一个地方修复所有其他模式(关机和休眠)。

$ file /usr/lib/systemd/systemd-sleep
/usr/lib/systemd/systemd-sleep: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=fa6da37bf95f4a7255909a8e18fecbc1f3910acc, for GNU/Linux 4.4.0, stripped

2. 移动

sudo mv /usr/lib/systemd/systemd-sleep /usr/lib/systemd/systemd-sleep.bin

3. 创建包装器脚本

例如,在我的 .bash_aliases 中我有:
alias lxcexport="systemd-inhibit lxc image export"。此别名调用的导出应阻止睡眠服务,直到 lxc 完成容器导出。

systemd-inhibit报告中,它被标记为被阻止systemd-抑制命令:

$ systemd-inhibit --list --no-pager
WHO                                UID  USER PID    COMM            WHAT                                WHY      MODE 
...
lxc image export server:container… 1000 cot 868971 systemd-inhibit shutdown:sleep:idle                 Unknown… block
...

因此,在包装器脚本中,我们将调用的睡眠操作延迟预定义的延迟时间(例如 5 秒),同时systemd-inhibit --list --no-pager --no-legend|grep systemd-inhibit返回非空结果。释放锁后,grep 将不返回任何内容,脚本将继续运行并使用传递的参数调用主睡眠服务二进制文件。

注意:请记住,一旦它触发,它不会在用户重新激活时自动停止。即,它将继续忽略您的操作。

sudo vi /usr/lib/systemd/systemd-sleep.wrapper

#!/bin/sh
while test -n "$(systemd-inhibit --list --no-pager --no-legend|grep systemd-inhibit)" ; do 
    printf '.'
    sleep 5
done

/usr/lib/systemd/systemd-sleep.bin $1

使其可执行。

sudo chmod +x /usr/lib/systemd/systemd-sleep

最后,创建包装器脚本的链接。这样,如果计划的系统更新覆盖了 systemd-sleep,您就不会丢失包装器脚本。

sudo ln -s /usr/lib/systemd/systemd-sleep.wrapper /usr/lib/systemd/systemd-sleep

在日志中它看起来像这样:

5 月 9 日 08:54:53 LIVE.ARCH.BOX systemd-logind[798]: 系统将立即挂起!
5 月 9 日 08:54:53 LIVE.ARCH.BOX systemd[1]: 已达到睡眠目标。5
月 9 日 08:54:53 LIVE.ARCH.BOX systemd[1]: 正在启动系统挂起...
5 月 9 日 08:54:53 LIVE.ARCH.BOX systemd-logind[798]: 操作“睡眠”已完成。5
月 9 日 08:58:27 LIVE.ARCH.BOX systemd[1545]: snap.lxd.lxc.9a9d4293-449f-4314-91b3-02aca1c4006b.scope: 已消耗 4 分 39.349 秒 CPU 时间。
5 月 9 日 08:58:29 LIVE.ARCH.BOX systemd-sleep[859442]: .........................................
5 月 9 日 08:58:29 LIVE.ARCH.BOX systemd-sleep[863081]: 即将暂停...
5 月 9 日 08:58:29 LIVE.ARCH.BOX systemd-sleep[863080]: 即将暂停...
5 月 9 日 08:58:29 LIVE.ARCH.BOX systemd-sleep.bin[863078]: 进入睡眠状态“暂停”...
5 月 9 日 08:58:29 LIVE.ARCH.BOX 内核: PM:暂停条目(深度)
5 月 9 日 08:58:29 LIVE.ARCH.BOX 内核: 文件系统同步:0.487 秒

提示 使用 pm-utils 可以完成相同的操作(但这次我直接修改了操作脚本):

$ which pm-hibernate
/usr/bin/pm-hibernate
10:24:34 [cot@LIVE ~]$ ls -la /usr/bin/pm-hibernate
lrwxrwxrwx 1 root root 31 May  8  2021 /usr/bin/pm-hibernate -> /usr/lib/pm-utils/bin/pm-action

$ cat /usr/lib/pm-utils/bin/pm-action

...
command_exists "check_$METHOD" && command_exists "do_$METHOD" || {
log "pm-utils does not know how to $METHOD on this system."
    exit 1
}

##delay if systemd-inhibit was called by someone
while test -n "$(systemd-inhibit --list --no-pager --no-legend|grep systemd-inhibit)" ; do 
    printf '.'
    sleep 55
done
...

相关内容