Posted on 12-16-2015 05:12 PM
I'm trying to show a popup whenever a USB device is connected. There are a few suggestions to use a launchdaemon with StartOnMount, but this gets triggered every time a computer is unlocked from screensaver. Do you have any suggestions on how to approach this problem?
Sample code below:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.company.popup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/path/to/script.sh</string>
</array>
<key>StartOnMount</key>
<true/>
</dict>
</plist>
#!/bin/bash
date >> /tmp/test.txt
Solved! Go to Solution.
Posted on 12-17-2015 08:28 AM
It may take some additional refinement but I think what you're trying to do is something like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.company.popup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/path/to/script.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Volumes/</string>
</array>
<key>KeepAlive</key>
<false/>
</dict>
</plist>
So that anytime there is change the the Volumes list (like a USB drive mounted) the pop up would be fired. If you wanted it to only fire with USB devices then you would need to refine this to check for the presence of new USB devices, etc.
Posted on 12-16-2015 06:51 PM
What is the script doing that gets triggered by the LaunchDaemon? Are you only sending the pop up message up if it sees an attached USB drive? I' thinking it might be possible to work around this within the script. Or, are you saying with a USB drive plugged in and the screensaver unlocked, the script fires, each time? If so, I would imagine in some way, the OS is remounting attached drives when the screen gets unlocked, although I don't know for sure. It does sound like that's the case though.
Posted on 12-17-2015 08:28 AM
It may take some additional refinement but I think what you're trying to do is something like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.company.popup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/path/to/script.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Volumes/</string>
</array>
<key>KeepAlive</key>
<false/>
</dict>
</plist>
So that anytime there is change the the Volumes list (like a USB drive mounted) the pop up would be fired. If you wanted it to only fire with USB devices then you would need to refine this to check for the presence of new USB devices, etc.
Posted on 12-17-2015 08:55 AM
I can confirm the behavior @dhom is describing. With a USB drive mounted and a LaunchAgent using StartOnMount to display a dialog, locking the screen and coming back later fires it. This seems to be because of an issue with Yosemite (not sure about 10.11) where locking the screen seems to incorrectly unmount the disks. I can tell this easily because I get a bunch of Notification Center messages explaining that the drive was not "Ejected Properly", which is BS, since all I did was lock my screen. See image below.
So of course, the LaunchAgent gets fired again after unlocking because the USB drive remounts, firing the script. I chalk this up to bugs in the OS that Apple has yet to fix. There's no logical reason for the drives to be unmounted by simply locking the screen. I never saw this behavior under 10.9 or earlier.
Posted on 12-28-2015 09:52 AM
I ended up going with @howardgmac's suggestion of using WatchPaths. The script checks for new USB volumes and shows the popup as needed.