Запустить команду при запуске / входе в систему (Mac OS X)

53

Мне было интересно, в какой файл я должен поместить эту команду bash, чтобы она запускалась при запуске.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

Я обыскивал сеть и думаю , что она находится между ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileили ~/.bash_profile. Хотя я пробовал это, и они, кажется, запускаются при запуске терминала, а не при запуске Mac . Я пропустил файл?

Wolfy87
источник

Ответы:

34

Официально ничего из этого. Apple предложила способ использовать launchd . Guis, чтобы настроить это, включают lingon и Launch Control

Что касается файлов, которые вы упомянули в домашнем каталоге ~ / .bashrc, ~ / profile, ~ / .bash_profile запускаются только при входе через терминал. Те, что в / etc, запускаются оболочкой, которая запускается для всех пользователей до тех, которые находятся в домашнем каталоге, но только после входа пользователя в систему. Руководство по bash

Сценарий запуска Unix включал / etc / rc *, но для OSX просто используйте файл launchd

user151019
источник
1
Так что, если моя команда вставлена ​​в любой из файлов, /etcона должна быть запущена при загрузке? Имеет ли значение, в каком он находится?
Wolfy87
1
/etc/bashrcи так далее, запускаются, когда вы запускаете оболочку, точно так же, как и ~/.bashrcто, что первый будет запускаться всякий раз, когда любой пользователь запускает оболочку, а не только ваш пользователь.
Скотт
@ Скотт прав, я исправил свой ответ
user151019
4
Хорошо, но я просто не могу понять, как использовать launchd, я попытался создать файл plist для своей программы, но я не знаю, как запустить его или как заставить его работать при загрузке.
Wolfy87
1
Ссылка @Mark на "launchd" не работает :(
Артем
59

Чтобы запустить команду при запуске в OS X, вам необходимо использовать launchd.

Если вы не хотите использовать Lingon , вам нужно создать список launchdсвойств. Это файл XML, так что вы можете сделать это с помощью вашего любимого текстового редактора или, в качестве альтернативы, вы можете использовать редактор списков свойств, который устанавливается с Mac OS X Dev Tools. Создайте следующее:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Сохраните это в /Library/LaunchAgents/some.meaningful.name.plist(вам понадобится учетная запись администратора и / или sudo), затем откройте терминал и выполните:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Это заставит launchd загрузить элемент, что заставит его запустить MongoDB при загрузке. В качестве бонуса launchdбудет следить за ним и, если он выйдет по какой-либо причине, он будет перезапущен. Чтобы избавиться от элемента, просто замените load в приведенной выше команде на unload.

Скотт
источник
1
На этой странице ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) перечислено много вещей, которые не должны запускаться с помощью launchd. Если я хочу запустить произвольную команду при запуске, у меня может не быть контроля, и команда может закончить делать эти вещи. Кроме того, я не хочу, чтобы launchd перезагружался и элемент, который останавливается, потому что он одноразовый или обрабатывает перезапуск самостоятельно. Что мне делать в этих случаях?
Майкл
@ Скотт, спасибо. Это самый полезный ответ, который я нашел в интернете.
Дмитрий
5
Это попытается запустить приложение каждые 10 секунд, что хорошо работает для служб, которые не умирают. Если это для сценария, который запускается один раз пунктуально (в моем случае, для обмена сообщениями один раз Slack при перезагрузке) добавьте <key>LaunchOnlyOnce</key><true/>к dict.
msanford
Отличный вопрос, мистер Сэнфорд. launchd, который не сдается, создает огромные файлы журнала, которые затем замедляют работу вашего Mac (из-за постоянного чтения и записи таких больших файлов журнала). Я могу использовать это исправление в некоторых плохо написанных коммерческих программах, работающих на моем компьютере.
Foliovision
1
Примечание для себя: Если вам нужны переменные окружения: serverfault.com/questions/111391/…
Quandary
49

Еще одно простое решение от переполнения стека : вы можете:

  • Запустите Automator.app;
  • Выберите «Приложение»;
  • Нажмите «Показать библиотеку» на панели инструментов (если скрыто);
  • Добавить «Run shell script» (из Действия / Утилиты);
  • Скопируйте и вставьте ваш скрипт в окно;
  • Проверь это;
  • Сохраните его где-нибудь: файл с именем your_name.appбудет создан);
  • В зависимости от вашей версии MacOSX:
    • Старые версии: перейдите в «Системные настройки» → «Аккаунты» → «Элементы входа» или
    • Новая версия: Перейти в Системные настройки → Пользователи и группы → Вход элементов (вверху справа);
  • Добавьте это вновь созданное приложение;

Выйдите из системы, войдите снова, и все готово. ;)

Хайме М.
источник
2
Протестировано и работает, и не требует запуска громоздкого редактирования списков или платного приложения Lingon.
Лукаш
4
Тем не менее, он добавляет около 1804 тыс. Шаблонов к вашему трехстрочному сценарию!
android.weasel
1
Спасибо за подробные инструкции по созданию чего-то полезного с Automator. Это поможет мне не только с одной задачей. Спасибо, пожалуйста, Хайме. Я использую его, чтобы отключить Turbo Boost через Turbo Boost Switcher. У меня есть платная версия, но механизмы лицензирования достаточно ужасны. Я предпочитаю использовать бесплатную версию, которая требует запуска через терминал, чтобы избежать запросов пароля администратора при каждом пробуждении из спящего режима.
Foliovision
1
@ ответ android.weasel знакомства Geekarist в superuser.com/a/995564/255375
JD
Суперпользователь :-D, +1
Мукул Гоэль
28

Чтобы запустить команды при входе в систему, вы можете сделать это:

  • Создайте текстовый файл, содержащий ваши команды (скрипт bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Сохранить этот файл в ~/Library/Startup.cmd

  • Вы можете проверить это, дважды щелкнув файл в Finder
  • Сделайте его исполняемым: chmod +x ~/Library/Startup.cmd
  • Добавьте этот файл в Системные настройки> Аккаунты> Элементы входа
Geekarist
источник
3
лучший и самый простой ответ imho. намного проще, чем принятое решение. обратите внимание, что это в Системных настройках> Пользователи и группы> Элементы входа в систему ... (не Учетные записи) ... а также обратите внимание, что файл может находиться где угодно, также не должен заканчиваться на .cmd. просто chmod + x это.
foreyez
5
Однако элементы входа в систему запускаются при входе в систему, а не при запуске системы. Если вы запускаете сервер, это большая разница.
not2savvy
Вы правы @ not2savvy. Для сервера я бы рекомендовал ответ @ Sridhar-Sarnobat с @reboot. Однако мой ответ позволил бы запустить графическую программу, поэтому я думаю, что это полезно.
Geekarist
Почему заканчивается cmdвместо sh?
Симин Цзе
3

Вам придется посмотреть, как launchdи как launchctlработать на MacOS. Вы можете начать с чтения справочных страниц для обеих команд. Затем вы можете заглянуть внутрь /Library/LaunchAgents/и найти /Library/LaunchDaemons/примеры того, как настроить приложения для загрузки в разное время через launchctlинтерфейс.

Вот пример, который я нашел на переполнении стека, который может помочь вам в дальнейшем.

Аяз
источник
0

Меня заинтересовал очень простой Unix-ответ на эту проблему, и я нашел его на другом сайте . Вот краткое изложение решения.

Стандарт для оболочек входа в систему - всегда искать файлы конфигурации bash с именем «profile» в следующем порядке: / etc / profile, ~ / .bash_profile, затем ~ / .bash_login и, наконец, ~ / .profile. Когда завершаются входы в систему, они читают ~ / .bash_logout.

В моем случае я просто создал ~ / .bash_profile, а затем открыл настройки для приложения Mac Terminal и изменил параметр «Оболочка открывается с» по умолчанию на / bin / bash. Вот и все. Чисто и просто.

markgp
источник
-3

открытый терминал, тип

nano ~/.bash_profile

затем добавьте этот текст в файл:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
МАКСИМУМ
источник
3
Это предполагает, что вы открываете окно терминала после входа в систему.
Arjan