我是 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
检测 USB 事件的简单方法是
udevadm monitor --kernel --property --subsystem-match=usb
程序化方法: https://raw.githubusercontent.com/gavv/snippets/master/udev/udev_monitor_usb.c
其他相关主题:
如何在 USB 设备插入(拔出)时运行代码,而不需要 root 权限? https://unix.stackexchange.com/questions/65891/how-to-execute-a-shellscript-when-i-plug-in-a-usb-device