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

20

Hay un directorio en Sistema / Biblioteca para los elementos de inicio que supongo: StartupItems

Necesito tener un script de shell que configure la interfaz de Ethernet en el inicio, con la dirección de red local y la máscara de subred. Necesito hacer esto porque el Las preferencias de red para configurar la interfaz de Ethernet NO lo establecerán utilizando ajustes manuales. ESTO parece ser un error serio, o mi instalación es malo.

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

El script debe hacer su trabajo con privilegios de root o con sudo, pero yo Suponiendo que si utiliza sudo, se presentará un diálogo de contraseña en el momento del arranque cuando el proceso de arranque llega a ese script.

(He tenido suficiente experiencia con FreeBsd y Linux para encontrar mi camino en el terminal, pero no necesariamente como se aplica a Mac OSX)

JeffK
fuente

Respuestas:

17

Una forma de hacerlo sería asignando al script un servicio launchd:

Crea el script de shell como de costumbre. Luego puedes hacer un servicio launchd para ejecutarlo al inicio. Los que se encuentran en /Library/LaunchDaemons. Estos están en el formato de lista de propiedades XML. Crea otro y rellénalo 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>

Cambio com.example.app, /bin/sh y /path/to/script según sea necesario.

La secuencia de comandos se ejecutará mientras el sistema se está iniciando. Si se ejecuta demasiado pronto, puede escribir la secuencia de comandos para intentar 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 </dict> línea:

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

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

andonuts
fuente
¿Cómo se llama este documento plist? ¿Y el / path / to / script == / System / Library / StartupItems / script?
JeffK
1
Para la primera pregunta: el nombre del documento plist generalmente usa lo que la clave de etiqueta en la lista de propiedades está configurada en (en este caso, "com.example.app") con una extensión .plist.
andonuts
1
Para la segunda pregunta: Eso es correcto, pero la secuencia de comandos debe moverse a otro lugar.
andonuts
Su lista es malformada. Necesitas una llave: <key>Program</key> con el valor <string>/bin/sh</string> y entonces <key>ProgramArguments</key> sólo debería tener el valor <string>/path/to/script</string>
Jon Brooks
En realidad, el mío también está mal: <key>ProgramArguments</key> necesita ser una matriz ..
Jon Brooks
16

Hace algún tiempo utilicé 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 * * * *".
sjosen
fuente
1
Muy útil para saber!
geotheory
6
cron No 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.
CousinCocaine
4
cron Es mucho más fácil de configurar que launchd, aunque. Solo compara las dos respuestas en este hilo para ver lo que quiero decir. cron toma una sola línea en un solo archivo, donde launchd necesita una secuencia de comandos para describir la secuencia de comandos que desea ejecutar en el arranque.
Dannid
@Dannid Kron no es sensible para ejecutar la duplicación, el almacenamiento en búfer de cola y otros. Aunque viable en este caso, no siempre es una llave maestra, ni tampoco una solución idiomática.
New Alexandria
Crontab es mucho mejor. Es rápido y sucio y se ha establecido durante mucho tiempo en el mundo de Unix. Yo totalmente cavar esta palabra clave @reboot.
macetw