Wie bekomme ich Shell-Skripte, die beim Start von Yosemite ausgeführt werden?

20

In System / Library befindet sich ein Verzeichnis für Startobjekte, von denen ich annehme: StartupItems

Ich benötige ein Shell-Skript, das beim Start die Ethernet-Schnittstelle mit lokaler Netzwerkadresse und Subnetzmaske konfiguriert. Ich muss dies tun, da die Netzwerkeinstellungen für die Konfiguration der Ethernet-Schnittstelle diese NICHT mithilfe manueller Einstellungen festlegen. Dies scheint ein schwerwiegender Fehler zu sein, oder meine Installation ist schlecht.

Ich erhielt den Rat, das Netzwerksetup über die Befehlszeile zu verwenden, das Ethernet-Interface wird jedoch nicht so konfiguriert, dass die Konfigurationen beim Neustart vorhanden sind.

Das Skript muss mit Root-Rechten oder mit sudo arbeiten, aber ich gehe davon aus, dass bei Verwendung von sudo beim Start ein Kennwortdialog angezeigt wird, wenn der Startvorgang dieses Skript startet.

(Ich habe genug Erfahrung mit FreeBsd und Linux, um mich im Terminal zurechtzufinden, aber nicht unbedingt, da dies für Mac OSX gilt.)

JeffK
quelle

Antworten:

17

Eine Möglichkeit wäre, dem Skript einen launchd-Dienst zuzuweisen:

Erstellen Sie das Shell-Skript wie gewohnt. Dann können Sie einen launchd-Dienst erstellen, um ihn beim Start auszuführen. Die befinden sich bei /Library/LaunchDaemons. Diese sind im XML-Eigenschaftenlistenformat. Erstellen Sie ein anderes und füllen Sie es mit so etwas:

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

Ändern com.example.app, /bin/shund je /path/to/scriptnach Bedarf.

Das Skript wird dann ausgeführt, während das System bootet. Wenn es zu früh ausgeführt wird, können Sie entweder das Skript schreiben, um zu versuchen, das zu tun, was es tun muss, bis es erfolgreich ist, oder es mit einem Fehlercode ungleich Null beenden und dies der Eigenschaftsliste vor der </dict>Zeile hinzufügen :

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

Für weitere Informationen zu OS X-Start-Daemons und -Diensten empfehle ich, hier nach einer nützlichen Kurzreferenz zu deren Erstellung oder hier nach einer umfassenderen Referenz zu den Funktionen von launchd zu suchen .

andonuts
quelle
Wie nennt man dieses Plist-Dokument? Und ist das / path / to / script == / System / Library / StartupItems / script?
JeffK
1
Zur ersten Frage: Der Name des Plist-Dokuments verwendet im Allgemeinen den Namen des Beschriftungsschlüssels in der Eigenschaftenliste (in diesem Fall "com.example.app") mit der Erweiterung .plist.
Andonuts
1
Zur zweiten Frage: Das ist richtig, aber das Skript sollte an einen anderen Ort verschoben werden.
Andonuts
Ihre Pliste ist fehlerhaft. Sie brauchen einen Schlüssel: <key>Program</key>mit dem Wert <string>/bin/sh</string>und <key>ProgramArguments</key>sollte dann nur den Wert haben<string>/path/to/script</string>
Jon Brooks
Eigentlich ist auch meins falsch: <key>ProgramArguments</key>Muss ein Array sein ..
Jon Brooks
16

Vor einiger Zeit habe ich cron benutzt, um genau das zu tun. Sie können einen solchen Eintrag vornehmen

@reboot /path/to/my/script

Mehr Infos hier

Anstelle der ersten fünf Felder kann eine von acht Sonderzeichenfolgen angezeigt werden:

       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
quelle
1
Sehr praktisch zu wissen!
Geotheory
7
cronist heutzutage nicht der richtige Weg, dies unter OS X zu tun. Verwenden Sie stattdessen LaunchAgent oder LaunchDeamon (launchd). Weitere Informationen: 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
cronist viel einfacher zu konfigurieren als launchd. Vergleichen Sie einfach die beiden Antworten in diesem Thread, um zu sehen, was ich meine. cronNimmt eine einzelne Zeile in eine einzelne Datei, in launchdder ein Skript zur Beschreibung des Skripts benötigt wird, das beim Start ausgeführt werden soll.
Dannid
@Dannid Kron reagiert nicht empfindlich auf Duplizierungen, Warteschlangenpufferung und andere Vorgänge. In diesem Fall ist es zwar realisierbar, aber weder immer ein Hauptschlüssel noch eine idiomatische Lösung.
New Alexandria
Crontab ist viel besser. Es ist schnell und schmutzig und in der Unix-Welt schon lange etabliert. Ich bin total begeistert von diesem @reboot Keyword.
Macetw