编辑-仅对特定命名的卷起作用

编辑-仅对特定命名的卷起作用

我是 Linux 新手,这可能是一个新手问题,所以,很抱歉。

我在车间使用 Linux PC,我想实现车间自动化。因此我安装了一个电源板,我的所有工具都插在上面。这样,我就能轻松地同时关闭所有工具。

我还在那里插了一个 USB 集线器的电源输入。当它关闭时,电脑会检测到它已断开连接。我可以使用这些信息在电脑断开连接时自动锁定或暂停电脑吗?

TLDR;我可以编写一个脚本,在 USB 设备断开连接时暂停 PC 吗?

答案1

连接(断开) USB 设备时的操作

下面的小脚本将在断开(任何) USB 卷时暂停计算机。

#!/usr/bin/env python3
import gi
from gi.repository import GLib, Gio
import subprocess

class WatchOut:

    def __init__(self):
        someloop = GLib.MainLoop()
        self.setup_watching()
        someloop.run()

    def setup_watching(self):
        self.watchdrives = Gio.VolumeMonitor.get()
        # event to watch (see further below, "Other options")
        self.watchdrives.connect("volume_removed", self.actonchange)

    def actonchange(self, *args):
        # command to run (see further below, "Other options")
        subprocess.Popen(["systemctl", "suspend"])

WatchOut()

使用方法:

  • 将脚本复制到一个空文件中,另存为watchout.py
  • 在后台运行:

    python3 /path/to/watchout.py
    
  • 如果一切按预期工作,则从启动时运行它

其他选择

"volume_removed"在这个脚本中,显然使用了信号 on 。其他可能的事件:

"volume_added", "volume_removed", "mount_added", "mount_removed"

为了使其在事件发生时执行其他命令,请替换该行中的命令:

subprocess.Popen(["systemctl", "suspend"])

(命令和参数设置为列表,如["systemctl", "suspend"]

编辑-仅对特定命名的卷起作用

正如评论中提到的,您更愿意只在特定命名的卷上运行命令。如果您使用一个或多个卷名作为参数运行以下示例,则操作将仅限于这些卷:

#!/usr/bin/env python3
import gi
from gi.repository import GLib, Gio
import subprocess
import sys

args = sys.argv[1:]

class WatchOut:

    def __init__(self):
        someloop = GLib.MainLoop()
        self.setup_watching()
        someloop.run()

    def setup_watching(self):
        self.watchdrives = Gio.VolumeMonitor.get()
        # event to watch (see further below, "Other options")
        self.watchdrives.connect("volume_removed", self.actonchange)

    def actonchange(self, event, volume):
        if volume.get_name() in args:
            # command to run (see further below, "Other options")
            subprocess.Popen(["systemctl", "suspend"])

WatchOut()

用法

与第一个非常相似,只需添加卷名作为参数,例如

python3 /path/to/watchout.py <volumename_1> <volumename_2>

答案2

相关内容