当 USB 设备(断开)连接时,如何运行命令?

Len*_*k24 3 scripts usb suspend events lock

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

我在我的车间使用 linux PC,我想自动化车间。这就是为什么我安装了一个电源板,我的所有工具都插入其中。这样就可以轻松地将我所有的工具都放在一起。

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

TLDR;我可以制作一个在 USB 设备断开连接时挂起 PC 的脚本吗?

Jac*_*ijm 5

对 (dis) 连接 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()
Run Code Online (Sandbox Code Playgroud)

使用:

其他选项

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

"volume_added", "volume_removed", "mount_added", "mount_removed"
Run Code Online (Sandbox Code Playgroud)

要使其在事件上执行其他命令,请替换该行中的命令:

subprocess.Popen(["systemctl", "suspend"])
Run Code Online (Sandbox Code Playgroud)

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

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

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

python3 /path/to/watchout.py
Run Code Online (Sandbox Code Playgroud)

用法

与第一个几乎相同,只需添加卷名作为参数,例如

python3 /path/to/watchout.py <volumename_1> <volumename_2>
Run Code Online (Sandbox Code Playgroud)