8 votos

Cómo iniciar una aplicación cuando se monta un disco específico

Yo almacenar toda mi música en un disco externo. Tengo iTunes para activar el inicio de sesión. Sin embargo, iTunes siempre empieza antes de que mi unidad cifrada ha montado, y de manera que iTunes se queja de que no puede encontrar su biblioteca.

He tratado de escribir un Applescript que en repetidas ocasiones se comprueba si una unidad está montada, y cuando se lanza iTunes.

tell application "System Events" to set diskNames to name of every disk
set iTunesDiskName to "Media"
set iTunesDiskIsMounted to false
set iTunesLaunched to false
if iTunesDiskName is in diskNames then set iTunesDiskIsMounted to true


repeat while iTunesLaunched is false
    if iTunesDiskIsMounted is true then
        tell application "iTunes" to launch
        set iTunesLaunched to true
    end if
    delay 5
end repeat

Esto funciona para el lanzamiento de iTunes si me quedo con la unidad montada. Sin embargo, si lo corro con el coche desmontado, que sigue funcionando y nunca detecta si el disco es posteriormente montado.

¿Qué estoy haciendo mal?

6voto

moodforaday Puntos 2633

Yo no downvote wch1zpink la respuesta, pero es mucho no la forma en que yo podría resolver el problema.

De tener una aplicación ejecutar un AppleScript cada 5 segundos es una manera muy ineficiente para controlar esta situación, especialmente desde Mac OS ya tiene incorporada una función para hacer esto, es decir, launchd.

Guardar esto como ~/Library/LaunchAgents/com.tjluoma.itunes-on-mount.plist (usted puede cambiar el "com.tjluoma.itunes-en-el monte" de la parte a la que quieras):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.tjluoma.itunes-on-mount</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>test -d /Volumes/Media &amp;&amp; open -j -g -a iTunes</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/Volumes</string>
    </array>
</dict>
</plist>

A continuación, reinicie su Mac o hacer


launchctl load ~/Library/LaunchAgents/com.tjluoma.itunes-on-mount.plist

en la Terminal. Entonces, en cualquier momento /Volúmenes/ cambios, launchd va a mirar a ver si /Volumes/Media existe, y si lo hace, será el lanzamiento de iTunes.

3voto

qarma Puntos 71

Una estancia-abrir la aplicación (Votación)

Aunque esta pregunta ya ha sido marcado como tener una solución satisfactoria, estoy obligado a proporcionar una alternativa. Estoy totalmente de acuerdo con @TJ Luoma, que ha proporcionado, lo que creo que es, con mucho, la solución óptima, teniendo en cuenta que la Estancia Abrir la aplicación que de las encuestas para los nombres de disco cada 5 segundos, y tiene que llamar a una aplicación externa para hacer esto, es que no la forma de abordar este problema. Es ineficiente, uso intensivo de los recursos, y totalmente engorroso tener un applet de vivir permanentemente en el dock, o incluso sólo de forma invisible en segundo plano, la realización de una única función en una forma terrible, cuando macOS tiene incorporado un medio para controlar el archivo de los eventos del sistema, y un gerente de servicio para responder a estos eventos y realizar tareas en forma programada y eficiente.

launchd

TJ Luoma del método tiene la ventaja de launchd a resolver el problema en lo que es, hasta donde yo soy consciente, de la manera recomendada. Monitorea los cambios en el /Volumes folderpath, y actúa en consecuencia. Es el método que yo elegiría y sé que no tiene que preocuparse acerca de lo que estaba pasando detrás de las escenas.

Acciones De Carpeta

Algunos podrían no ser conscientes de que macOS las Acciones de Carpeta también se puede monitorear el /Volumes carpeta, y si AppleScript se siente más en casa a alguien que un .plist y un script de shell, entonces esta solución puede ser más atractivo. Hasta donde yo soy consciente, de acciones de carpeta ejecuta como un proceso en launchd, por lo que aunque operan abiertamente en diferentes formas para el usuario, los mecanismos subyacentes son, posiblemente, el mismo, o similar, y no es probable para ver cualquiera de las diferencias de rendimiento entre los dos.

La aplicación

La configuración es muy fácil, incluso si usted no lo ha hecho antes. Esto supone dos pasos:

  1. Guarde el siguiente AppleScript, dándole el nombre de cualquier cosa que usted desea, y guardarlo en la Carpeta de secuencias de comandos de Acción carpeta que se encuentra en ~/Library/Scripts/Folder Action Scripts. Me salvó la mía como una llanura .applescript archivo de texto usando el Editor de secuencias de Comandos, y nombró New Volume Mounted.applescript:

    property diskName : "Media" -- whatever the disk is named
    property _objRef : a reference to reference
    
    
    script disks
        property path : missing value
        property kind : "public.volume"
        property list : missing value
    
        on _get(mountPoints)
            local mountPoints
    
            set my list to mountPoints
    
            tell application id "com.apple.systemevents" to ¬
                repeat with fURL in (a reference to my list)
                    if fURL's type identifier = my kind ¬
                        then set fURL's contents to ¬
                        the disk named fURL
                end repeat
    
            return every reference in my list
        end _get
    
        on _eval(key)
            if my list = missing value then return
    
            tell application id "com.apple.systemevents"
                tell {}
                    repeat with _disk in (a reference to my list)
                        set _objRef to _disk
                        set the end to contents of the key
                    end repeat
    
                    return it
                end tell
            end tell
        end _eval
    end script
    
    
    on adding folder items to mountedVolumes after receiving mountPoints
        local mountedVolumes, mountPoints
    
        disks's _get(mountPoints)
    
        set propertyKey to a reference to the name of my _objRef
        set disknames to disks's _eval(propertyKey)
    
        if the diskname is in the disknames then exec()
    end adding folder items to
    
    
    on removing folder items from mountedVolumes after losing diskNames
        local mountedVolumes, diskNames
    
        -- display alert "Disk removed: " & diskNames
    end removing folder items from
    
    
    on exec()
        -- display alert "Disk attached"
        run application id "com.apple.iTunes"
    end exec
    
  2. Hay un método convencional a la par de una carpeta de secuencia de comandos de acción con una carpeta vigilada, pero por lejos el más simple es copiar y pegar el siguiente script en el Editor de secuencias de Comandos y, si es necesario, edite la tercera línea de la declara property script. Esto quiere tener el mismo nombre (con la extensión de archivo) como su secuencia de comandos anterior. Si usted eligió el mismo nombre que se hizo en el primer paso, no es necesario realizar ningún ajuste en absoluto. Simplemente ejecutar la secuencia de comandos y todo va a ser establecido, teniendo un efecto inmediato. No hay necesidad de guardar este script, y no es necesario reiniciar el equipo.

    use sys : application id "com.apple.systemevents"
    
    property path : "/Volumes"
    property script : "New Volume Mounted.applescript"
    
    property name : a reference to the name of folder path
    property folder action : a reference to folder action named (my name)
    property folder : a reference to Folder Action scripts folder
    property file : a reference to the file named (my script) in my folder
    
    set folder actions enabled to true
    
    if not (my file exists) then return open my folder
    
    tell my folder action
        if (exists) then return its scripts
    
        make new folder action with properties my {name:name, path:path}
        make new script with properties my file's ¬
            {name:name, POSIX path:POSIX path}
    
        set [its enabled, its scripts's enabled] to [true, true]
    end tell
    

    Esta secuencia de comandos sólo se ha probado en la Alta Sierra

Postscript

La secuencia de comandos en el paso 1 de arriba es uno que escribí hace un tiempo como una generalizada de secuencia de comandos que aquellos que se sienten cómodos con AppleScript puede fácilmente adaptar y ampliar para realizar cualquiera de las tareas que uno desea, y ya tenemos disponible una lista de todos los nuevos puntos de montaje creado en /Volumes en la forma de una lista validada de disk objetos.

Es, sin embargo, en realidad más de lo que es necesario para esta tarea a la mano. Usted es bienvenido a pegarse a él, y debería funcionar bien. Pero, si usted prefiere un simple script, entonces esto a continuación se realiza exactamente la misma función que el anterior, pero con toda la grasa recortada:

property diskName : "Media" -- whatever the disk is named
property path : "/Volumes"
property diskVolumePath : [path, "/", diskName, "/"] as text


on adding folder items to mountedVolumes after receiving mountPaths
    local mountedVolumes, mountPoints

    repeat with mountPath in mountPaths
        set mountPath's contents to ¬
            mountPath's POSIX path
    end repeat

    if the mountPaths contains the diskVolumePath then exec()
end adding folder items to


on removing folder items from mountedVolumes after losing diskNames
    local mountedVolumes, diskNames

    -- display alert "Disk removed: " & diskNames
end removing folder items from


on exec()
    -- display alert "Disk attached"
    run application id "com.apple.iTunes"
end exec

3voto

qarma Puntos 71

Este es un seguimiento a TJ Luoma la respuesta, que espero solucionar los problemas con la .plist definición que detiene el trabajo se ejecute de la manera correcta.

De manlaunchd.plist:

WatchPaths

Esta clave opcional hace que el trabajo debe iniciarse si alguno de los mencionados los caminos son modificados.

IMPORTANTE: el Uso de esta clave es muy desanimado, como sistema de archivos evento el monitoreo es altamente raza propensa, y es completamente posible que las modificaciones se puede perder. Cuando las modificaciones son atrapados, no hay ninguna garantía de que el archivo se encuentra en un estado coherente cuando el trabajo se pone en marcha.

<array of strings>

Esta clave opcional hace que el trabajo se inicie cada vez que un sistema de ficheros es montado.

Aquí es una versión revisada StartOnMount definición incorporando <boolean> a favor de las .plist. Actualmente está etiquetada StartOnMount, que, si sin cambios, significa que el archivo debe ser guardado en WatchPaths:

"local.startOnMount.iTunes"

El ~/Library/LaunchAgents/local.StartOnMount.iTunes.plist clave como alternativa, se puede ser más similar a la de TJ original <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>local.StartOnMount.iTunes</string> <key>ProgramArguments</key> <array> <string>/usr/bin/osascript</string> <string>-e</string> <string>if (list disks) contains "Media" then ¬ run application id "com.apple.iTunes"</string> </array> <key>RunAtLoad</key> <false/> <key>StandardErrorPath</key> <string>/tmp/local.StartOnMount.iTunes.stderr</string> <key>StandardOutPath</key> <string>/tmp/local.StartOnMount.iTunes.stdout</string> <key>StartOnMount</key> <true/> </dict> </plist> comando:

ProgramArguments

Sin embargo, en las pruebas, me encontré con que, si iTunes ya está en ejecución y se oculta, entonces callng la bash comando-incluso con la <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>-c</string> <string>[[ -d "/Volumes/Media" ]] &amp;&amp; open -jg -b "com.apple.iTunes"</string> </array> y/o open opción(s)-trae iTunes en el primer plano. Así que he elegido para hacer uso -j realizar las mismas acciones, pero de manera más consecuente.

Esta nueva -g aparece para resolver los problemas, y sólo se ejecuta el trabajo cuando un sistema de archivos es montado, que a su vez sólo se realiza una acción si es el correcto nombre de disco. Para reemplazar:

osascript

Sin embargo, si algo no está funcionando como se esperaba, y no es inmediatamente obvio por qué, a continuación, busque en la .plist carpeta para archivo(s) nombrado cd ~/Library/LaunchAgents launchctl unload com.tjluoma.itunes-on-mount.plist launchctl load local.StartOnMount.iTunes.plist y/o /tmp/:

local.StartOnMount.iTunes.stderr

1voto

wch1zpink Puntos 11

Guarde el siguiente código AppleScript como una aplicación "permanecer abierta" en Script Editor.app. Desactive iTunes al iniciar sesión pero habilite su nueva aplicación "permanecer abierto" para iniciar al iniciar sesión.

Asegúrese de otorgar los permisos adecuados en las Preferencias del sistema para que su nuevo applet controle su computadora.

 on run
    --  Executed when the script is launched
    checkForMedia()
end run

on idle
    -- checks every five seconds if diskNames contains "Media"
    checkForMedia()
    return 5 -- in seconds
end idle

on checkForMedia()
    tell application "System Events" to set diskNames to name of every disk
    if diskNames contains "Media" then
        tell application "iTunes" to launch
        quit me -- Quits this applet after diskNames contains "Media" and launches itunes
    end if
end checkForMedia

on quit
    continue quit -- allows the script to quit
end quit
 

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X