come ottenere script di shell da eseguire all'avvio su Yosemite


21

C'è una directory in Sistema / Libreria per gli elementi di avvio che presumo: StartupItems

Ho bisogno di uno script di shell che configuri l'interfaccia Ethernet all'avvio, con indirizzo di rete locale e maschera di sottorete. Devo farlo perché le preferenze di rete per la configurazione dell'interfaccia Ethernet NON la imposteranno utilizzando le impostazioni manuali. QUESTO sembra essere un grave errore o la mia installazione è errata.

Mi è stato dato il consiglio di utilizzare networksetup dalla riga di comando, ma ciò non configura l'interfaccia Ethernet in modo tale che le configurazioni siano presenti al riavvio.

Lo script deve fare il suo lavoro con i privilegi di root, o con sudo, ma suppongo che se usa sudo, ci sarà una finestra di dialogo della password presentata all'avvio quando il processo di avvio arriva a quello script.

(Ho avuto abbastanza esperienza con FreeBsd e Linux per orientarmi nel terminale, ma non necessariamente come si applica a Mac OSX)

Risposte:


18

Un modo per farlo sarebbe assegnare allo script un servizio di avvio:

Crea lo script della shell come al solito. Quindi è possibile creare un servizio launchd per eseguirlo all'avvio. Quelli si trovano a /Library/LaunchDaemons. Questi sono nel formato dell'elenco delle proprietà XML. Creane un altro e popolarlo con qualcosa del genere:

<?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>

Cambiamento com.example.app, /bin/she /path/to/scriptcome richiesto.

Lo script verrà quindi eseguito durante l'avvio del sistema. Se viene eseguito troppo presto, puoi scrivere lo script per provare a fare ciò che deve fare fino a quando non riesce, oppure farlo uscire con un codice di errore diverso da zero e aggiungerlo all'elenco delle proprietà prima della </dict>riga:

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

Per ulteriori informazioni sui demoni e sui servizi di lancio di OS X, suggerisco di cercare qui un riferimento rapido su come realizzarli o qui un riferimento più completo su cosa può fare launchd.


Come si chiama questo documento plist? E lo / path / to / script == / System / Library / StartupItems / script?
JeffK,

1
Per la prima domanda: il nome del documento plist generalmente utilizza ciò su cui è impostata la chiave Label nell'elenco delle proprietà (in questo caso "com.example.app") con estensione .plist.
andonuts,

1
Per la seconda domanda: è corretto, ma lo script dovrebbe essere spostato altrove.
andonuts,

Il tuo plist non è valido. Hai bisogno di una chiave: <key>Program</key>con il valore <string>/bin/sh</string>e quindi <key>ProgramArguments</key>dovrebbe avere solo il valore<string>/path/to/script</string>
Jon Brooks,

In realtà, anche il mio è sbagliato: <key>ProgramArguments</key>deve essere un array ...
Jon Brooks,

16

Qualche tempo fa ho usato cron per fare proprio questo. È possibile effettuare una voce come questa

@reboot /path/to/my/script

Maggiori informazioni qui

Invece dei primi cinque campi, potrebbe apparire una delle otto stringhe speciali:

       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 * * * *".

1
Molto utile da sapere!
geoteca il

7
cronal giorno d'oggi non è il modo giusto di farlo su OS X. Utilizzare invece LaunchAgent o LaunchDeamon (launchd). Per maggiori informazioni: 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è molto più facile da configurare di launchd, però. Confronta le due risposte in questa discussione per capire cosa intendo. cronprende una singola riga in un singolo file, dove è launchdnecessario uno script per descrivere lo script che si desidera eseguire all'avvio.
Dannid,

@Dannid Kron non è sensibile all'esecuzione di duplicazioni, buffering delle code e altri. Sebbene fattibile in questo caso, non è sempre una chiave di scheletro, né è una soluzione idiomatica.
Nuova Alessandria,

Crontab è molto meglio. È veloce, sporco e consolidato nel mondo Unix. Ho completamente scavato questa parola chiave @reboot.
macetw,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.