як змусити сценарії оболонки для запуску при запуску на Yosemite


21

У системі / бібліотеці є каталог для елементів запуску, які я припускаю: StartupItems

Мені потрібно мати сценарій оболонки, який буде налаштовувати інтерфейс Ethernet при запуску, з адресою локальної мережі та маскою підмережі. Мені потрібно це зробити, оскільки мережеві налаштування для налаштування інтерфейсу Ethernet НЕ встановлюють його за допомогою ручних налаштувань. Це здається серйозною помилкою, або моя установка погана.

Мені дали поради використовувати networksetup з командного рядка, але це не налаштує інтерфейс Ethernet таким чином, що конфігурації будуть там при перезавантаженні.

Сценарій повинен виконувати свою роботу з привілеями root або з sudo, але я припускаю, що якщо він використовує sudo, під час завантаження буде відкрито діалог паролів, коли процес завантаження потрапить до цього сценарію.

(У мене було достатньо досвіду роботи з FreeBsd та Linux, щоб знайти шлях у терміналі, але це не обов'язково, як це стосується Mac OSX)

Відповіді:


18

Одним із способів зробити це буде призначення сценарію запущеною службою:

Створіть сценарій оболонки як завжди. Тоді ви можете зробити службу запуску, щоб запустити її при запуску. Вони розташовані за адресою /Library/LaunchDaemons. Вони є у форматі списку властивостей XML. Створіть іншу і заповніть її приблизно так:

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

Зміна com.example.app, /bin/shі по /path/to/scriptмірі необхідності.

Потім сценарій запускається під час завантаження системи. Якщо вона працює надто рано, ви можете або написати сценарій, щоб спробувати зробити все, що потрібно зробити, поки це не вдасться, або вийти з ненульовим кодом помилки та додати це до списку властивостей перед </dict>рядком:

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

Щоб отримати докладнішу інформацію про демонстрації демонів та служб OS X, я пропоную шукати тут хороший короткий довідник про їх виготовлення, або тут, щоб отримати більш повну інформацію про те, що може зробити запуск.


Як ви називаєте цей пліст-документ? І чи / path / to / script == / System / Library / StartupItems / script?
JeffK

1
Перше питання: Ім'я документа-плістера зазвичай використовує те, для чого встановлено ключ Label у списку властивостей (у цьому випадку "com.example.app") з розширенням .plist.
andonuts

1
Щодо другого питання: Це правильно, але сценарій слід перемістити в інше місце.
andonuts

Ваш пліст неправильно сформований. Вам потрібен ключ: <key>Program</key>зі значенням, <string>/bin/sh</string>а тоді <key>ProgramArguments</key>повинен просто мати значення<string>/path/to/script</string>
Джон Брукс

Насправді і моє помиляється: <key>ProgramArguments</key>має бути масив ..
Джон Брукс

16

Деякий час тому я використовував cron, щоб зробити саме це. Ви можете зробити запис таким чином

@reboot /path/to/my/script

Більше інформації тут

Замість перших п'яти полів може з'явитися один з восьми спеціальних рядків:

       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
Дуже зручно знати!
геотеорія

7
cronце не правильний спосіб зробити це в OS X в наші дні. Використовуйте замість LaunchAgent або LaunchDeamon (запуск). Для отримання додаткової інформації: 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налаштувати набагато простіше, ніж launchdвсе-таки. Просто порівняйте дві відповіді в цій темі, щоб побачити, що я маю на увазі. cronзаймає один рядок в одному файлі, де launchdпотрібен сценарій для опису сценарію, який потрібно запустити під час завантаження.
Даннід

@Dannid Kron не чутливий до запуску дублювання, буферизації черги та інших. Хоча це є життєздатним у цьому випадку, це не завжди ключ скелета, і це не ідіоматичне рішення.
Нова Олександрія

Кронтаб набагато кращий. Це швидко і брудно і давно утвердилося у світі Unix. Я повністю викопую це ключове слово @reboot.
macetw

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.