как заставить сценарии оболочки работать при запуске на Yosemite

21

В System / Library есть каталог для элементов автозагрузки, который я предполагаю: StartupItems

Мне нужно иметь скрипт оболочки, который настроит интерфейс Ethernet при запуске, с адресом локальной сети и маской подсети. Я должен сделать это, потому что сетевые настройки для настройки интерфейса Ethernet НЕ установят его, используя ручные настройки. Это кажется серьезной ошибкой, или моя установка плохая.

Мне дали совет использовать networksetup из командной строки, но это не настроит интерфейс Ethernet таким образом, что конфигурации будут там при перезагрузке.

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

(У меня было достаточно опыта работы с FreeBsd и Linux, чтобы найти выход в терминале, но не обязательно, поскольку это относится к Mac OSX)

JeffK
источник

Ответы:

18

Один из способов сделать это - назначить сценарий службе launchd:

Создайте скрипт оболочки как обычно. Затем вы можете создать сервис launchd для запуска при запуске. Те расположены в /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 демонов и пусковых услугах, я предлагаю смотреть здесь для хорошей быстрой справки о внесении их, или здесь для более полного ознакомления на то , что запуск программ может сделать.

andonuts
источник
Что вы называете этим списком документов? И работает ли / path / to / script == / System / Library / StartupItems / script?
JeffK
1
По первому вопросу: имя документа plist обычно использует то, для чего установлен ключ 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 * * * *".
sjosen
источник
1
Очень удобно знать!
геотеория
7
cronэто не правильный способ сделать это на OS X в наши дни. Вместо этого используйте LaunchAgent или LaunchDeamon (launchd). Для получения дополнительной информации: 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.
кузен Кокаин
4
cronнамного проще в настройке, чем launchd, хотя. Просто сравните два ответа в этой теме, чтобы понять, что я имею в виду. cronзанимает одну строку в одном файле, где launchdнужен скрипт для описания скрипта, который вы хотите запустить при загрузке.
Даннид,
@Dannid Kron не чувствителен к запуску дублирования, буферизации очереди и другим. Несмотря на жизнеспособность в этом случае, это не всегда ключ от скелета, и при этом это не идиоматическое решение.
Новая Александрия
Crontab намного лучше. Это быстро и грязно и давно установлено в мире Unix. Я полностью копаю это ключевое слово @reboot.
macetw