jak zdobyć skrypty powłoki do uruchamiania podczas uruchamiania na Yosemite

21

W Systemie / Bibliotece znajduje się katalog dla elementów startowych. Zakładam: StartupItems

Potrzebuję skryptu powłoki, który skonfiguruje interfejs Ethernet podczas uruchamiania, z adresem sieci lokalnej i maską podsieci. Muszę to zrobić, ponieważ preferencje sieciowe dotyczące konfiguracji interfejsu Ethernet NIE ustawią go przy użyciu ustawień ręcznych. TO wydaje się być poważnym błędem lub moja instalacja jest zła.

Poradzono mi, aby korzystać z networksetup z wiersza poleceń, ale nie skonfiguruje on interfejsu Ethernet w taki sposób, że konfiguracje będą dostępne po ponownym uruchomieniu.

Skrypt musi wykonywać swoją pracę z uprawnieniami administratora lub sudo, ale zakładam, że jeśli używa sudo, w czasie uruchamiania pojawi się okno dialogowe hasła, gdy proces rozruchu dotrze do tego skryptu.

(Mam wystarczające doświadczenie z FreeBsd i Linux, aby znaleźć się w terminalu, ale niekoniecznie, ponieważ dotyczy to Mac OSX)

JeffK
źródło

Odpowiedzi:

18

Jednym ze sposobów jest przypisanie skryptu uruchomionej usługi:

Utwórz skrypt powłoki jak zwykle. Następnie możesz utworzyć uruchomioną usługę, aby uruchamiała ją podczas uruchamiania. Te znajdują się na /Library/LaunchDaemons. Są w formacie listy właściwości XML. Utwórz inny i wypełnij go czymś takim:

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

Zmiana com.example.app, /bin/sha /path/to/scriptw razie potrzeby.

Skrypt zostanie następnie uruchomiony podczas uruchamiania systemu. Jeśli uruchomi się zbyt wcześnie, możesz napisać skrypt, aby spróbować zrobić to, co trzeba, dopóki się nie powiedzie, lub opuścić kod z niezerowym kodem błędu i dodać go do listy właściwości przed </dict>wierszem:

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

Aby uzyskać więcej informacji na temat demonów i usług uruchamiania systemu OS X, sugeruję poszukać tutaj krótkiego podręcznika na temat ich tworzenia lub tutaj, aby uzyskać bardziej wyczerpujące informacje na temat tego, co może zrobić uruchomiona wersja.

Andonuts
źródło
Jak nazywasz ten dokument plist? I czy / path / to / script == / System / Library / StartupItems / script?
JeffK
1
W przypadku pierwszego pytania: nazwa dokumentu plist na ogół używa tego, co ustawiony jest klawisz Label na liście właściwości (w tym przypadku „com.example.app”) z rozszerzeniem .plist.
andonuts
1
Drugie pytanie: to prawda, ale skrypt należy przenieść w inne miejsce.
andonuts
Twój plist jest zniekształcony. Potrzebujesz klucza: <key>Program</key>z wartością, <string>/bin/sh</string>a następnie <key>ProgramArguments</key>powinieneś mieć tylko tę wartość<string>/path/to/script</string>
Jon Brooks,
Właściwie moje też się myli: <key>ProgramArguments</key>musi być tablicą ..
Jon Brooks,
16

Jakiś czas temu użyłem crona, aby to zrobić. Możesz dokonać takiego wpisu

@reboot /path/to/my/script

Więcej informacji tutaj

Zamiast pierwszych pięciu pól może pojawić się jeden z ośmiu ciągów specjalnych:

       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
źródło
1
Bardzo przydatne!
geotheory 23.03.15
7
cronnie jest obecnie właściwym sposobem na zrobienie tego w systemie OS X. Zamiast tego użyj LaunchAgent lub LaunchDeamon (uruchomione). Aby uzyskać więcej informacji: 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
cronjest o wiele łatwiejszy do skonfigurowania niż launchd. Wystarczy porównać dwie odpowiedzi w tym wątku, aby zobaczyć, co mam na myśli. cronpobiera jeden wiersz w jednym pliku, w którym launchdpotrzebny jest skrypt do opisania skryptu, który chcesz uruchomić podczas rozruchu.
Dannid
@Dannid Kron nie jest wrażliwy na duplikację, buforowanie kolejek i inne. Chociaż w tym przypadku jest to wykonalne, nie zawsze jest to klucz szkieletowy, ani nie jest rozwiązaniem idiomatycznym.
Nowa Aleksandria
Crontab jest znacznie lepszy. Jest szybki, brudny i ma długą tradycję w świecie uniksowym. Całkowicie przekopuję to słowo kluczowe @reboot.
macetw