cómo hacer que los scripts de shell se ejecuten al inicio en Yosemite

Hay un directorio en System/Library para elementos de inicio, supongo: StartupItems

Necesito tener un script de shell que configure la interfaz ethernet al inicio, con dirección de red local y máscara de subred. Necesito hacer esto porque las preferencias de red para configurar la interfaz ethernet NO la configurarán usando la configuración manual. ESTO parece ser un error grave, o mi instalación es mala.

Me dieron el consejo de usar la configuración de red desde la línea de comandos, pero eso no configurará la interfaz de ethernet de tal manera que las configuraciones estarán allí al reiniciar.

La secuencia de comandos debe hacer su trabajo con privilegios de root o con sudo, pero asumo que si usa sudo, se presentará un cuadro de diálogo de contraseña en el momento del arranque cuando el proceso de arranque llegue a esa secuencia de comandos.

(He tenido suficiente experiencia con FreeBsd y Linux para orientarme en la terminal, pero no necesariamente como se aplica a Mac OSX)

Respuestas (3)

Una forma de hacerlo sería asignarle al script un servicio de lanzamiento:

Cree el script de shell como de costumbre. Luego puede crear un servicio de lanzamiento para ejecutarlo al inicio. Esos están ubicados en /Library/LaunchDaemons. Estos están en formato de lista de propiedades XML. Cree otro y rellénelo con algo como esto:

<?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.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

Cambiar com.example.app, /bin/shy /path/to/scriptsegún sea necesario.

El script se ejecutará mientras el sistema se está iniciando. Si se ejecuta demasiado pronto, puede escribir el script para tratar de hacer lo que debe hacer hasta que tenga éxito, o hacer que salga con un código de error distinto de cero y agregarlo a la lista de propiedades antes de la </dict>línea:

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

Para obtener más información sobre los demonios y servicios de lanzamiento de OS X, sugiero buscar aquí una buena referencia rápida sobre cómo crearlos, o aquí para obtener una referencia más completa sobre lo que puede hacer launchd.

¿Cómo se llama este documento plist? ¿Y el /path/to/script == /System/Library/StartupItems/script?
Para la primera pregunta: el nombre del documento plist generalmente usa la clave de etiqueta en la lista de propiedades (en este caso, "com.example.app") con una extensión .plist.
Para la segunda pregunta: eso es correcto, pero la secuencia de comandos debe moverse a otro lugar.
Tu plist está mal formado. Necesita una clave: <key>Program</key>con el valor <string>/bin/sh</string>y luego <key>ProgramArguments</key>solo debe tener el valor<string>/path/to/script</string>
En realidad, el mío también está mal: <key>ProgramArguments</key>debe ser una matriz ...

Hace algún tiempo usé cron para hacer precisamente eso. Puedes hacer una entrada como esta

@reboot /path/to/my/script

Más información aquí

En lugar de los primeros cinco campos, puede aparecer una de las ocho cadenas especiales:

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".
¡Muy útil saberlo!
cronno es la forma correcta de hacer esto en OS X en estos días. Utilice LaunchAgent o LaunchDeamon en su lugar (launchd). Para más información: developer.apple.com/library/mac/documentation/MacOSX/Conceptual/… Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
cronSin embargo, es mucho más fácil de configurar que launchd. Simplemente compare las dos respuestas en este hilo para ver a qué me refiero. crontoma una sola línea en un solo archivo, donde launchdnecesita una secuencia de comandos para describir la secuencia de comandos que desea ejecutar en el arranque.
@Dannid Kron no es sensible a la ejecución de la duplicación, el almacenamiento en búfer de la cola y otros. Aunque viable en este caso, no siempre es una clave maestra, ni es una solución idiomática.
Crontab es mucho mejor. Es rápido y sucio y está establecido desde hace mucho tiempo en el mundo Unix. Me encanta esta palabra clave @reboot.
@macetw Idealmente, sí. Y sí, está establecido desde hace mucho tiempo en el mundo Unix. Sin embargo, eso puede ser que esté obsoleto en macOS y lo haya sido durante algún tiempo. Nunca se sabe con cosas obsoletas: puede haber un momento en que ya no sea compatible. Y sí , @reboot es útil y es algo que tienen otros Unices, pero recomendar algo que está en desuso es una estupidez. ¿Lamentable que esté en desuso? Sí. Sobre todo para los que somos veteranos. Pero sigue siendo como es. Al igual que la parodia que es systemd... Pero eso no importa.

Eche un vistazo a la secuencia de comandos de enlace de inicio de sesión.

https://wiki.afp548.com/index.php/Login/Logout_Hooks_in_OS_X

Loginwindow.app inicia un enlace de inicio de sesión, que no es lo mismo que ejecutar un script al inicio.