¿Cómo puedo ejecutar/detener/reiniciar una aplicación automáticamente, al iniciar/iniciar sesión/en otro momento?

¿Cómo hace que un script o una aplicación se ejecuten o dejen de ejecutarse automáticamente cuando se inicia el sistema, un usuario inicia sesión, en un momento específico, cuando se conecta un disco, etc.?

Lingon es solo una aplicación para hacer que la creación de archivos .plist para el lanzamiento sea más fácil de usar. También alguien hizo un creador de plist de lanzamiento basado en la web: plist.spotmac.de
¡Abucheo! plist.spotmac.de parece haberse ido. :-(

Respuestas (5)

Método Gui

Si desea que algo se ejecute cuando un usuario inicia sesión, la forma más fácil es usar la GUI. Usted puede

  • Vaya a la System Prefs > Accounts > Login Itemspantalla y agregue el elemento allí
    • haciendo clic en el +símbolo
    • arrastrando y soltando .appen el panel
  • En el Dock, abra el menú contextual de una aplicación, seleccione Optionsy, a continuación, seleccioneOpen at Login

método lanzado

Si desea lanzar algo que no es un .app, o si desea tener más control sobre su lanzamiento, como por ejemplo:

  • en un momento determinado o en un intervalo especificado
  • reiniciando continuamente si falla
  • no relacionado con el inicio de sesión del usuario
  • en función del acceso a la red
  • solo se ejecuta cuando se está ejecutando otro proceso
  • cuando se agrega un archivo a una carpeta
  • etc.

entonces desea utilizar la solución técnica que es launchd.

La forma más fácil de configurar un launchdarchivo de configuración es usar una herramienta para ayudar. En el momento de escribir este artículo, el método más popular es Lingon (que tiene una versión gratuita anterior disponible en SourceForge) o la herramienta del sitio web PList .

Codificación manual

Si no desea utilizar Lingon o el sitio web de PList y solo desea utilizar las herramientas sin procesar disponibles en el sistema, puede escribir las suyas launchd plista mano .

Aquí está mi secuencia de comandos launchd para ejecutar SomeApp continuamente después de que se inicie el sistema (independientemente de que un usuario inicie sesión). Está en /System/Library/LaunchAgents/ y se llama SomeApp.restart.plist. Si se ejecuta en función del inicio de sesión de un usuario, podría almacenarse en ~/Library/LaunchAgents/

<?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>RunAtLoad</key>  
        <true/>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>SomeApp.restart</string>
        <key>ProgramArguments</key>
        <array>
                <string>/path/to/SomeApp.app/Contents/MacOS/SomeApp</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>5</integer>
            <key>Minute</key>
            <integer>10</integer>
       </dict>
</dict>
</plist>

Cargarlo una vez con

launchctl load ~/Library/LaunchAgents/SomeApp.restart.plist
  • La RunAtLoadopción iniciará la aplicación la primera vez que launchctl ejecute esto.
  • La KeepAliveopción reiniciará la aplicación si falla.
  • Lo StartCalendarIntervalejecutará en un momento determinado. Presumiblemente, esto es mutuamente excluyente con los dos anteriores, pero se incluye para mostrar lo que se puede hacer conlaunchd
  • Launchctl ejecutará esto después de reiniciar.

Hay muchas opciones adicionales que se pueden encontrar experimentando con Lingon o leyendo las páginas de manual para launchctl, launchd.plist, plist, launchd.conf, etc.

Gracias, realmente útil. También puede usar launchctl load -w ...para hacer que el cambio sea persistente. Según sus comentarios, actualicé mi script de configuración de OSX poweruser
Parece que launchctl loadestá en desuso después de Big Sur. Puedes correr launchctl enable gui/$UID/SomeApp.restarten su lugar.

Lingon todavía funciona. Lo usé la semana pasada para crear una "tarea programada". Después de descargarlo, tuve que usar su actualizador automático para obtener la última versión, pero funciona bien.

Lingon también está ahora en la App Store
Pero para encontrar la versión gratuita de código abierto, debe buscarla en Sourceforge. La última versión comercial tampoco funciona en Leopard (10.5). Pero 2.1.1 sí: consulte sourceforge.net/projects/lingon/files/Lingon/2.1.1

Si solo es necesario ejecutarlo cuando se inicia el sistema, use la pestaña Elementos de inicio de sesión del panel de preferencias Cuentas en Preferencias del sistema.

texto alternativo

Si es un script, use AppleScript Editor para guardarlo como una aplicación. Si no es un script de AppleScript, aún puede usar AppleScript para ejecutar el script de esta manera:

do shell script "your script here"

Eh ? Está usted seguro de eso ? Dice en la interfaz de usuario de su captura de pantalla "Estos elementos se abrirán automáticamente cuando inicie sesión". ¿No es diferente de cuando se inicia el sistema? Además, su enlace parece 404.

No olvide los ganchos de inicio de sesión.

Aunque se ejecutan como root, debería poder ejecutar un script $HOME/.loginhook usando algo como esto:

#!/bin/sh

home=`eval echo ~$user`

if [ -x "$home/.loginhook" ]; then
    logger -t $0 "executing .loginhook of user $user"
    su - $user -c "$home/.loginhook"
fi

Luego, simplemente agregue los comandos que desee al ~/.loghook

Además, aunque 'launchd' es "la forma de Mac", crontab sigue siendo una opción perfectamente viable, y es mucho más fácil de editar a mano que los archivos XML launchd.

Personalmente, felizmente pagué $5 por Lingon .

Entonces, el script en el bloque de código debe guardarse como /path/to/script, y sudo defaults write com.apple.loginwindow LoginHook /path/to/script? ¿Y el punto de ejecutar un script en el directorio de inicio es que cada usuario puede tener un personalizado (o no) ~/.loginhook?
@Lri - sí, precisamente. Lo siento, eso no fue más claro. El código de bloque podría ser /usr/local/bin/loginhook.sh y, dado que lo ejecuta root, buscará un $HOME/.loginhook cuando un usuario inicie sesión y lo ejecutará como ese usuario.

Ejecutar una aplicación en un momento específico se puede hacer fácilmente en iCal, ¡como acabo de descubrir gracias a otro foro!

  1. Cree un nuevo evento en iCal para la hora en que desea que se abra la aplicación.
  2. En 'Alerta', elija 'Abrir archivo', por lo que puede configurar un archivo para que se abra, lo que obviamente también abrirá la aplicación predeterminada para ese tipo de archivo.
  3. Para abrir una aplicación, en lugar de un archivo, cambie el menú desplegable 'iCal' a 'Otro...' y elija la aplicación que desea ejecutar.

Una cosa a tener en cuenta es que si tiene varias Mac compartiendo cosas a través de iCloud, este evento también se ejecutará en esas aplicaciones, que puede o no desear. Para que esto solo suceda en una sola Mac, debe crear el evento en un calendario 'En mi Mac', lo que puede hacer de la siguiente manera...

  1. Oculte todos los demás calendarios de iCloud o compartidos en la barra de la izquierda pasando el cursor sobre el nombre del calendario y haciendo clic en el botón "ocultar" que aparecerá.
  2. Ahora haga clic con el botón derecho (o haga clic en Opción si es un completo cretino y aún no se ha dado cuenta de que tiene más de un dedo y puede cambiar las preferencias de su mouse para que sea un poco más útil que su estado predeterminado de 'ladrillo cretino para cretinos') ) y seleccione 'Nuevo calendario'.
  3. Debido a que todos los calendarios compartidos están ocultos, este nuevo calendario se creará como 'En mi Mac' y será local para esta Mac.

Acabo de descubrir esto por mí mismo y me sorprendieron gratamente ambos consejos, así que pensé en compartirlos aquí.

Obtuve la información de estas personas útiles aquí... ¡así que gracias gente!...

http://osxdaily.com/2013/04/15/launch-file-app-scheduled-date-mac-os-x/