Ejecutar comando al iniciar / iniciar sesión (Mac OS X)

53

Me preguntaba en qué archivo debería colocar este comando bash para que se ejecute al inicio.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

He estado buscando en la red y creo que es entre ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileo ~/.bash_profile. Aunque he probado estos y parecen ejecutarse en el inicio del terminal, no en el inicio de Mac . ¿Me estoy perdiendo un archivo?

Wolfy87
fuente

Respuestas:

33

Oficialmente ninguno de estos. La forma sugerida por Apple es usar launchd . Las guis para configurar esto incluyen lingon y Launch Control

En cuanto a los archivos que menciona, los del directorio de inicio ~ / .bashrc, ~ / profile, ~ / .bash_profile solo se inician cuando inicia sesión a través de un terminal. Los que están en / etc están a cargo de la cáscara de partida para todos los usuarios antes de los de directorio principal, pero sólo cuando se realiza un inicio de sesión de usuario .. manual de fiesta

El script de inicio de Unix involucraba / etc / rc * pero para OSX solo use las cosas de launchd

usuario151019
fuente
1
Entonces, si mi comando se inserta en cualquiera de los archivos /etc, ¿debería ejecutarse en el arranque? ¿Importa en cuál está?
Wolfy87
1
/etc/bashrcy así sucesivamente se ejecutan cuando se inicia un shell, al igual ~/.bashrcque: es solo que el primero se ejecutará cada vez que cualquier usuario inicie un shell, en lugar de solo su usuario.
Scott
@Scott es correcto He corregido mi respuesta
user151019
44
De acuerdo, pero no puedo entender cómo usar launchd, intenté hacer un archivo plist para mi programa pero no tengo idea de cómo ejecutarlo o cómo ejecutarlo en el arranque.
Wolfy87
1
@Mark enlace a "launchd" está roto :(
Artem
58

Para ejecutar un comando al iniciar OS X, debe usarlo launchd.

Si no desea utilizar Lingon , debe crear una launchdLista de propiedades. Este es un archivo XML, por lo que puede hacerlo con su editor de texto favorito o, alternativamente, puede usar el Editor de lista de propiedades que está instalado con las herramientas de desarrollo de Mac OS X. Crea lo siguiente:

<?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>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Guarde esto en /Library/LaunchAgents/some.meaningful.name.plist(necesitará una cuenta de administrador y / o sudo), luego abra una terminal y haga:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Esto hará que launchd cargue el elemento, lo que hará que se inicie MongoDB en el arranque. Como launchdbeneficio adicional, lo supervisará y, si sale por algún motivo, se reiniciará. Para deshacerse del elemento, simplemente reemplace load en el comando anterior con unload.

Scott
fuente
1
Esta página ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) enumera muchas cosas que algo lanzado por launchd no debería hacer. Si quiero ejecutar un comando arbitrario al inicio, es posible que no tenga control y que el comando termine haciendo esas cosas. Además, es posible que no desee que launchd se reinicie y que el elemento se detenga porque es único o maneja el relanzamiento por sí solo. ¿Qué debo hacer en estos casos?
Michael
@ Scott, gracias. Esta es la respuesta más útil que encontré en Internet.
Dmitriy
55
Esto intentará ejecutar la aplicación cada 10 segundos, lo que funciona bien para servicios que no mueren. Si se trata de un script que se ejecuta una vez puntualmente (en mi caso, mensajes una vez que Slack al reiniciar) agregue <key>LaunchOnlyOnce</key><true/>al dict.
msanford
Gran punto, señor Sanford. launchd que no se rinde crea archivos de registro enormes que luego ralentizan su Mac (debido a la lectura y escritura de archivos de registro tan grandes continuamente). Puedo usar esa corrección en algunos de los programas comerciales mal escritos que se ejecutan en mi computadora ahora.
Foliovision
1
Nota mental: Si necesita variables de entorno: serverfault.com/questions/111391/...
Dilema
48

Otra solución simple de Stack Overflow : puede:

  • Inicie Automator.app;
  • Seleccione "Aplicación";
  • Haga clic en "Mostrar biblioteca" en la barra de herramientas (si está oculto);
  • Agregue "Ejecutar script de shell" (desde Actions / Utilities);
  • Copie y pegue su script en la ventana;
  • Pruébalo;
  • Guárdelo en algún lugar: se your_name.appcreará un archivo llamado );
  • Dependiendo de su versión de MacOSX:
    • Viejas versiones: Ir a Preferencias del Sistema → → Cuentas artículos inicio de sesión, o
    • Nueva versión: vaya a Preferencias del sistema → Usuarios y grupos → Elementos de inicio de sesión (arriba a la derecha);
  • Agregue esta aplicación recién creada;

Cierre sesión, vuelva a iniciar sesión y ya debería haber terminado. ;)

Jaime M.
fuente
2
Probado y funciona, no requiere la edición de plista engorrosa ni la aplicación de pago Lingon.
Lukasz
44
¡Sin embargo, agrega aproximadamente 1804k de repetitivo a su shellscript de tres líneas!
android.weasel
1
Gracias por las instrucciones detalladas sobre cómo hacer algo útil con Automator. Esto me ayudará no solo con la única tarea. Gracias amablemente Jaime. Lo estoy usando para desactivar Turbo Boost a través de Turbo Boost Switcher. Soy dueño de la versión de pago, pero la mecánica de la licencia es lo suficientemente horrible. Prefiero usar la versión gratuita que requiere el lanzamiento a través de la terminal para evitar solicitudes de contraseña de administrador en cada despertar del sueño.
Foliovision
1
@ respuesta de android.weasel Ver Geekarist superuser.com/a/995564/255375
JD
Super-ful :-D, +1
Mukul Goel
28

Para iniciar comandos al iniciar sesión, puede hacer esto:

  • Cree un archivo de texto que contenga sus comandos (script bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Guarda este archivo en ~/Library/Startup.cmd

  • Puede probarlo haciendo doble clic en el archivo en el Finder
  • Hazlo ejecutable: chmod +x ~/Library/Startup.cmd
  • Agregue este archivo en Preferencias del sistema> Cuentas> Elementos de inicio de sesión
Geekarist
fuente
3
La mejor y más fácil respuesta en mi humilde opinión. Solución mucho más fácil que aceptada. tenga en cuenta que está en Preferencias del sistema> Usuarios y grupos> Elementos de inicio de sesión ... (no en Cuentas) ... y también tenga en cuenta que el archivo puede estar en cualquier lugar, no tiene que terminar con .cmd tampoco. solo chmod + x it.
foreyez
55
Sin embargo, los elementos de inicio de sesión se ejecutan al iniciar sesión, no al inicio del sistema. Si ejecuta un servidor, esa es una gran diferencia.
not2savvy
Tienes razón @ not2savvy. Para un servidor, recomendaría la respuesta de @ Sridhar-Sarnobat con @reboot. Sin embargo, mi respuesta permitiría iniciar un programa gráfico, por eso creo que es útil.
Geekarist
¿Por qué termina con en cmdlugar de sh?
Simin Jie
3

Tendrás que ver cómo launchdy launchctltrabajar en MacOS. Puede comenzar leyendo las páginas del manual para ambos comandos. Luego, puede mirar dentro /Library/LaunchAgents/y ver /Library/LaunchDaemons/ejemplos de cómo configurar aplicaciones para cargar en diferentes momentos a través de la launchctlinterfaz.

Aquí hay un ejemplo que encontré en Stack Overflow que podría ayudarte más.

ayaz
fuente
0

Estaba interesado en una respuesta unix muy simple a este problema y la encontré en otro sitio . Aquí hay un resumen de la solución.

El estándar para los shells de inicio de sesión es buscar siempre los archivos de configuración de bash con "perfil" en el nombre, en este orden: / etc / profile, ~ / .bash_profile, luego ~ / .bash_login y finalmente ~ / .profile. Cuando salen los shells de inicio de sesión, leen ~ / .bash_logout.

En mi caso, acabo de crear el ~ / .bash_profile y luego abrí las preferencias para la aplicación Mac Terminal y cambié la opción "Shell se abre con" de forma predeterminada a / bin / bash. Eso es. Limpio y sencillo.

markgp
fuente
-3

terminal abierta, tipo

nano ~/.bash_profile

luego agregue este texto al archivo:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
MAX
fuente
3
Esto supondría que abres una ventana de Terminal después de iniciar sesión.
Arjan