Ejecutar script al iniciar sesión mac [cerrado]

280

Me pregunto si alguien puede ayudarme a ejecutar un archivo .sh cuando inicio sesión en mi cuenta en mi computadora. Estoy ejecutando Mac OS X 10.6.7.

Tengo un archivo "Example.sh" que quiero ejecutar cuando inicio sesión en mi computadora. No tengo problemas para ejecutarlo cuando ya estoy conectado, pero quiero que esto se ejecute automáticamente.

La gente dice que lo agregue al archivo de shell de inicio de sesión, pero no sé dónde está. Un poco de ayuda por favor.

MZimmerman6
fuente
3
Esto no está fuera de tema ... Lo necesitaba para iniciar mi demonio Emacs;) Por cierto, la mejor respuesta es en mi humilde opinión la aplicación Lingon X.
HappyFace
1
No me importa si esto está fuera de tema. Es la mejor respuesta que encontré en Internet y merece respeto. La ignoré para otros la primera vez que buscaba una solución y ¡fue un gran error!
Sethmr

Respuestas:

379

Sigue esto:

  • comienzo Automator.app
  • Seleccione Application
  • haga clic Show libraryen la barra de herramientas (si está oculto)
  • agregar Run shell script(desde el Actions/Utilities)
  • copia y pega tu script en la ventana
  • Pruébalo
  • guardar en algún lugar (por ejemplo, puede hacer una Applicationscarpeta en su INICIO, obtendrá un your_name.app)

  • ir a System Preferences-> Accounts->Login items

  • agrega esta aplicación
  • prueba y hecho;)

EDITAR:

Recientemente obtuve una insignia de "Buena respuesta" por esta respuesta. Si bien mi solución es simple y funciona, la forma más limpia de ejecutar cualquier programa o script de shell en el momento de inicio de sesión se describe en la respuesta de @ trisweb , a menos que desee interactividad .

Con la solución de automatización puede hacer cosas como las siguientes: aplicación de inicio de sesión de captura de pantalla del automatizador

por lo tanto, solicitar ejecutar un script o salir de la aplicación, solicitar contraseñas, ejecutar otros flujos de trabajo del automatizador en el momento de inicio de sesión, ejecutar aplicaciones condicionalmente en el momento de inicio de sesión, etc.

jm666
fuente
2
@GregMiernicki LOL, buenos días ...;) Hace casi un año agregué un EDITAR a mi respuesta, donde decía esto también. Pero, esto es un poco más simple para los usuarios promedio, porque crear archivos XML (plist) no es muy fácil de usar para muchos usuarios. De todos modos, gracias por un comentario. ;)
jm666
44
@GregMiernicki y no lo olvides, con la solución Automator puedes hacer scripts de inicio de sesión INTERACTIVOS, por ejemplo, un script que te pedirá alguna entrada (por ejemplo, contraseña adicional o algo parecido). El mundo no es solo blanco o negro , al menos, es como una cebra ... :) :)
jm666
2
@Cupidvogel Ejecutar un demonio en el momento de inicio de sesión es exactamente el trabajo para la solución de launchd; consulte la respuesta de trisweb. Si puede administrar un demonio de Python, está seguro de que puede administrar un archivo de configuración de plist donde puede administrar todos los aspectos de reinicios y así sucesivamente ...
jm666
3
Felicitaciones por señalar la otra respuesta como la más limpia. Eso debería obtener una buena insignia de ciudadanía :).
studgeek
2
Respuesta asombrosa Exporte PATH = / usr / local / bin: $ PATH, al comienzo del script, si desea ejecutar comandos como "actualización global del compositor" al iniciar el sistema.
Leonardo
377

tl; dr: lanzador proceso nativo uso de OSX y gerente, launchd.

Para hacerlo, haz un launchctldemonio. Tendrás control total sobre todos los aspectos del guión. Puedes correr una vez o mantenerte vivo como un demonio. En la mayoría de los casos, este es el camino a seguir.

  1. Cree un .plistarchivo de acuerdo con las instrucciones en los documentos de Apple Dev aquí o más detalles a continuación.
  2. Colocar en ~/Library/LaunchAgents
  3. Inicie sesión (o ejecute manualmente a través de launchctl load [filename.plist])

Para más información launchd, el artículo de Wikipedia es bastante bueno y describe el sistema y sus ventajas sobre otros sistemas más antiguos.


Aquí está el archivo plist específico para ejecutar un script al iniciar sesión .

Actualizado el 25/09/2017 para OSX El Capitan y más reciente (crédito a José Messias Jr ):

<?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.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Reemplace <string>después de la tecla Programa con su comando deseado (tenga en cuenta que cualquier script al que haga referencia ese comando debe ser ejecutable: chmod a+x /path/to/executable/script.shpara asegurarse de que sea para todos los usuarios).

Guardar como ~/Library/LaunchAgents/com.user.loginscript.plist

Ejecutar launchctl load ~/Library/LaunchAgents/com.user.loginscript.plisty cerrar sesión / iniciar sesión para probar (o para probar directamente, ejecutar launchctl start com.user.loginscript)

Cola /var/log/system.logpara mensajes de error.

La clave es que esta es una entrada iniciada específica del usuario, por lo que se ejecutará al iniciar sesión para el usuario dado. Los demonios de inicio específicos del sistema (colocados en /Library/LaunchDaemons) se ejecutan en el arranque.

Si desea que se ejecute un script al iniciar sesión para todos los usuarios, creo que LoginHook es su única opción, y esa es probablemente la razón por la que existe.

trisweb
fuente
44
Si. FWIW Encontré útil este blog sobre la misma técnica: developernotes.com/archive/2011/04/06/169.aspx
Daniel James el
8
Usted no menciona lo que es dudoso acerca de las acciones de Automator, y por qué 'no se recomiendan'.
Mike Campbell
44
Aquí hay una buena descripción general sobre las acciones de la carpeta vs launchctl: apple.stackexchange.com/a/63731/38290 - Y otra sobre una de las limitaciones de LoginHook (solo se permite un script): superuser.com/a/377401 . No es realmente que sea un método dudoso o deficiente, sino launchctlque simplemente es mucho mejor en la mayoría de los casos, y le brinda más control sobre todos los aspectos posibles de la ejecución de su script. Es más en el sentido de "¿por qué usar un método menos capaz cuando existe launchd?" (Tenga en cuenta que he cambiado la primera oración para indicar que personalmente no los recomiendo para esta situación).
trisweb
3
¿Se pregunta cómo creará LaunchDaemon, que se ejecutará cada vez que el usuario inicie sesión? . Entonces, no cuando se inicia el sistema, sino cada vez que el usuario inicia sesión (intente con el ciclo de cierre de sesión). ¿Puede mostrar exactamente (no solo bla-bla) cómo implementar la solución de automatización anterior (por equivocación) con launchctl?
cajwine
9
Los archivos Plist en / Library / LaunchAgents / se ejecutan al iniciar sesión con la identificación del usuario conectado. Los archivos Plist en / Library / LaunchDaemons / se ejecutan en el momento del arranque como root (la identificación se puede cambiar con la clave de usuario ).
bain
42
  1. Cree su script de shell como login.shen su carpeta $ HOME.

  2. Pegue la siguiente secuencia de comandos de una línea en el Editor de secuencias de comandos:

    hacer el script de shell "$ HOME / login.sh"

  3. Luego guárdelo como una aplicación.

  4. Finalmente, agregue la aplicación a sus elementos de inicio de sesión.

Si desea que el resultado del script sea visual, puede cambiar el paso 2 por esto:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Si se necesitan varios comandos, se puede usar algo como esto:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell
anubhava
fuente
1
He vinculado este, lo único que falta es un instalador de línea de comando;)
sorin
1
Buena solución ¿Cómo puedo ocultar la ventana de "inicio de sesión"? Traté de marcar los elementos de inicio de sesión.
xgdgsc
1
@xgdgsc: Goto Go to System Preferences -> Accounts -> Login itemsy marque la casilla Ocultar para esta aplicación.
anubhava
1
@anubhava Como dije, ya marqué la casilla Ocultar para esta aplicación de inicio de sesión. Pero todavía aparece y es necesario forzarlo a cerrar cuando apaga la computadora.
xgdgsc
2
@xgdgsc: Oh ok, ¿revisaste la ~/Library/LaunchAgentscarpeta?
anubhava