如何保存从 bash 中的 gdbus 调用返回的文件描述符?

How to save file descriptor returned from gdbus call in bash?

我正在尝试使用

#!/bin/bash
sudo gdbus call -y -d org.freedesktop.login1 \
                   -o /org/freedesktop/login1 \
                   -m org.freedesktop.login1.Manager.Inhibit \
                   sleep me because block
sleep 10

在 bash 脚本中获取抑制器锁。此方法的内省如下所示:

Inhibit(in  s what,
        in  s who,
        in  s why,
        in  s mode,
        out h pipe_fd);

我对 gdbus 的调用完成后,在使用 systemd-inhibit --list 列出时,没有抑制剂锁显示为已获取。我假设这是因为锁被获取,然后在退出 gdbus.

时立即释放

如何从方法调用中复制返回的文件描述符 pipe_fd,使其在退出调用后不会立即释放锁?

How can I duplicate the returned file descriptor, pipe_fd, from the method call so it doesn't release the lock immediately after exiting from the call?

你不能用命令行 gdbus 工具做到这一点,因为它在调用 D-Bus 后立即退出,因此 FD 返回给内核。

您将需要用其他语言(可能是 Python)编写一个脚本,该脚本进行 D-Bus 调用,然后对返回的 FD before 它退出。在这种情况下,您可能会发现使用 systemd 自己的 Python 绑定比直接调用 D-Bus 更容易。

或者,您可以将 bash 脚本包装在对 systemd-inhibit 的调用中,这是一个禁止关机的命令行实用程序,而另一个脚本是 运行.