Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? 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