Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
4年前关闭。
当我从笔记本电脑上拔下交流适配器时,我希望所有USB驱动器都自动卸载。如果打开了阻止设备的应用程序,则应将其杀死。一旦一切都被杀死并卸下,便会发出信号音,表明现在可以安全拔出插头了。
用例是快速拿起笔记本电脑,而不必弄乱ui以断开所有驱动器的连接,但要避免不干净的卸载。
关于如何开始的任何提示都非常棒,谢谢!
回答
有关完整的复制和粘贴脚本,请参见下面的答案。
如果您的USB设备安装到/ mount / media,请执行以下操作:
请注意这一点,因为如果您没有阻止的应用程序,打开
然后,在拔下交流适配器时调用此脚本,方法是将此行添加到
Nuetrino的以下答案显示了如何检测交流电拔出事件,该答案: How do I find out which process is preventing a umount?显示了如何列出并杀死阻止设备卸载的所有进程(我用lsof取得的成功要好于fuser -c,有时它没有列出即使umount仍被阻止的任何进程)
细节
使用
然后将
现在,您可以使用自己喜欢的属性设置udev规则,如下所示。
收到内核uvent时,我将运行自定义脚本“ bright_replug”和“ bright_unplug”。
您可以使用
监视器将打印以下接收到的事件:UDEV-该事件
udev在规则处理内核之后发出-内核uevent
您可以使用
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
4年前关闭。
当我从笔记本电脑上拔下交流适配器时,我希望所有USB驱动器都自动卸载。如果打开了阻止设备的应用程序,则应将其杀死。一旦一切都被杀死并卸下,便会发出信号音,表明现在可以安全拔出插头了。
用例是快速拿起笔记本电脑,而不必弄乱ui以断开所有驱动器的连接,但要避免不干净的卸载。
关于如何开始的任何提示都非常棒,谢谢!
回答
有关完整的复制和粘贴脚本,请参见下面的答案。
如果您的USB设备安装到/ mount / media,请执行以下操作:
kill -9 $(lsof -t $(mount | grep "/mount/media" | cut -d " " -f 1)) # Exit processes blocking umount cleanly
kill $(lsof -t $(mount | grep "/mount/media" | cut -d " " -f 1)) # Force kill remaining open processes
umount $(mount | grep "/mount/media" | cut -d " " -f 1) # Unmount USB drives
请注意这一点,因为如果您没有阻止的应用程序,打开
lsof
将返回所有pids
,并且您将kill
运行的操作系统。请参阅下面的复制和粘贴脚本,以获取可处理这种情况的有效实现。然后,在拔下交流适配器时调用此脚本,方法是将此行添加到
/etc/udev/rules.d
SUBSYSTEM=="power_supply", ACTION=="change", ATTR{online}=="0" , RUN+="/path/to/script/shown/above"
Nuetrino的以下答案显示了如何检测交流电拔出事件,该答案: How do I find out which process is preventing a umount?显示了如何列出并杀死阻止设备卸载的所有进程(我用lsof取得的成功要好于fuser -c,有时它没有列出即使umount仍被阻止的任何进程)
细节
使用
udevadm monitor
记录事件,例如KERNEL[20154.545075] change /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/ADP0 (power_supply)
然后将
udevadm info -a -p
与事件一起使用以获取属性udevadm info -a -p /devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/ADP0
looking at device '/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0003:00/power_supply/ADP0':
KERNEL=="ADP0"
SUBSYSTEM=="power_supply"
DRIVER==""
ATTR{online}=="0"
ATTR{type}=="Mains"
现在,您可以使用自己喜欢的属性设置udev规则,如下所示。
最佳答案
您可以定义udev规则来做到这一点。
只需将规则放在/etc/udev/rules.d
这是我的一个示例,当我卸下交流适配器时,该示例用于控制亮度。
SUBSYSTEM=="power_supply", ACTION=="change", ATTR{online}=="0" , RUN+="/usr/local/bin/bright_unplug"
SUBSYSTEM=="power_supply", ACTION=="change", ATTR{online}=="1" , RUN+="/usr/local/bin/bright_replug
收到内核uvent时,我将运行自定义脚本“ bright_replug”和“ bright_unplug”。
您可以使用
udevadm monitor
监视器将打印以下接收到的事件:UDEV-该事件
udev在规则处理内核之后发出-内核uevent
您可以使用
udevadm info
匹配更多属性关于linux - 通过以编程方式关闭打开的应用程序,强制卸载USB驱动器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34242611/
10-13 07:25