wie man Shell-Skripte dazu bringt, beim Start auf Yosemite ausgeführt zu werden

Ich nehme an, es gibt ein Verzeichnis in System/Library für Startobjekte: StartupItems

Ich brauche ein Shell-Skript, das die Ethernet-Schnittstelle beim Start konfiguriert, mit lokaler Netzwerkadresse und Subnetzmaske. Ich muss dies tun, da die Netzwerkeinstellungen zum Konfigurieren der Ethernet-Schnittstelle diese NICHT mit manuellen Einstellungen festlegen. Dies scheint ein schwerwiegender Fehler zu sein, oder meine Installation ist fehlerhaft.

Mir wurde geraten, networksetup über die Befehlszeile zu verwenden, aber das konfiguriert die Ethernet-Schnittstelle nicht so, dass die Konfigurationen beim Neustart vorhanden sind.

Das Skript muss seine Arbeit mit Root-Rechten oder mit sudo erledigen, aber ich gehe davon aus, dass bei Verwendung von sudo beim Booten ein Passwortdialog angezeigt wird, wenn der Boot-Prozess zu diesem Skript gelangt.

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

Antworten (3)

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. Diese befinden sich in /Library/LaunchDaemons. Diese liegen im XML-Eigenschaftslistenformat vor. Erstellen Sie ein weiteres und füllen Sie es mit etwas wie dem folgenden:

<?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 Sie com.example.app, /bin/shund /path/to/scriptnach Bedarf.

Das Skript wird dann ausgeführt, während das System hochfährt. 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 Eigenschaftenliste vor der </dict>Zeile hinzufügen:

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

Wenn Sie mehr über OS X-Startdämonen und -dienste erfahren möchten, schlage ich vor, hier nach einer netten Kurzreferenz zu deren Erstellung zu suchen, oder hier nach einer umfassenderen Referenz darüber, was launchd tun kann.

Wie nennt man dieses Plist-Dokument? Und ist /path/to/script == /System/Library/StartupItems/script?
Für die erste Frage: Der Name des plist-Dokuments verwendet im Allgemeinen den Namen des Label-Schlüssels in der Eigenschaftsliste (in diesem Fall „com.example.app“) mit einer .plist-Erweiterung.
Zur zweiten Frage: Das ist richtig, aber das Skript sollte an eine andere Stelle verschoben werden.
Ihre plist ist fehlerhaft. Sie brauchen einen Schlüssel: <key>Program</key>mit dem Wert <string>/bin/sh</string>und dann <key>ProgramArguments</key>sollte nur noch der Wert stehen<string>/path/to/script</string>
Eigentlich ist meins auch falsch: <key>ProgramArguments</key>Muss ein Array sein.

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

@reboot /path/to/my/script

Mehr Infos hier

Anstelle der ersten fünf Felder kann eine von acht speziellen Zeichenfolgen erscheinen:

       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 * * * *".
Sehr praktisch zu wissen!
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.
cronist jedoch viel einfacher zu konfigurieren als launchd. Vergleichen Sie einfach die beiden Antworten in diesem Thread, um zu sehen, was ich meine. crondauert eine einzelne Zeile in einer einzelnen Datei, in launchdder ein Skript benötigt wird, um das Skript zu beschreiben, das beim Booten ausgeführt werden soll.
@Dannid Kron reagiert nicht empfindlich auf Laufduplizierung, Warteschlangenpufferung und andere. Obwohl es in diesem Fall praktikabel ist, ist es nicht immer ein Skelettschlüssel und auch keine idiomatische Lösung.
Crontab ist viel besser. Es ist schnell und schmutzig und seit langem in der Unix-Welt etabliert. Ich mag dieses @reboot-Schlüsselwort total.
@macetw Im Idealfall ja. Und ja, es ist seit langem in der Unix-Welt etabliert. Das kann jedoch sein, dass es in macOS veraltet ist und das schon seit einiger Zeit. Bei veralteten Dingen weiß man nie: Es kann eine Zeit geben, in der es nicht mehr unterstützt wird. Und ja , @reboot ist nützlich und es ist etwas, das einige andere Unices haben, aber immer noch etwas zu empfehlen, das veraltet ist, ist dumm. Schade, dass es veraltet ist? Ja. Besonders für diejenigen von uns, die alte Hasen sind. Aber es ist immer noch so, wie es ist. Ähnlich wie die Travestie, die systemd ist ... Aber das macht nichts.

Sehen Sie sich das Login-Hook-Skript an.

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

Ein Anmelde-Hook wird von loginwindow.app initiiert, was nicht dasselbe ist wie das Ausführen eines Skripts beim Start.