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

Мне было интересно, в какой файл я должен поместить эту команду 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. Я пропустил файл?

12 ответов

Решение

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

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

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

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

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

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

Чтобы запустить команду при запуске в 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.

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

  • Создайте текстовый файл, содержащий ваши команды (скрипт 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
  • Добавьте этот файл в Системные настройки> Аккаунты> Элементы входа

Если вам нужен подход, который будет работать в Linux и Mac OS X, задачи cron должно быть достаточно (отредактируйте задачи cron, выполнив crontab -e ):

@reboot /path/to/script

(Авторы: https://unix.stackexchange.com/questions/49207/how-do-i-set-a-script-that-it-will-run-on-start-up-in-freebsd )

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

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

Хотя я не считаю приемлемыми ответы, в которых вас просят добавить вызов в .bash_profile или .bashrc, они могут сработать, по моему мнению.

Вы можете щелкнуть правой кнопкой мыши значок терминала, когда он находится в Dock, и выбрать «Параметры» > «Открыть при входе в систему».

У меня есть скрипт автоматического входа в VPN для работы. Мне тоже нужно открывать терминал во время работы. Поэтому я предпочитаю, чтобы он автоматически запускался при запуске, и я использовал .bashrc для автоматического запуска моего сценария VPN.

Вы можете использовать crontab:

Сначала создайте где-нибудь скрипт (скажем, /path/to/script.sh) и введите там команду, которую вы хотите запустить. Затем введитеchmod +x /path/to/script.sh.

Теперь в Терминале:

      EDITOR=nano crontab -e

Вам будет представлен текстовый редактор в терминале.

Введите файл:

      @reboot /path/to/script.sh

Нажмите Ctrl+ X, нажмите yи нажмите enter, и при следующей загрузке все запустится!

Если вы хотите запустить команду в фоновом режиме, просто добавьте & после команды в скрипте.

Этот ответ объясняет, как запустить команду при входе в систему, и основан на . Здесь сценарий заключен в приложение AppleScript. AppleScript был выбран вместо рабочего процесса, поскольку приложение Script Editor не перезаписывает изменения, внесенные в файл приложения вручную, в отличие от приложения Automator. Обертывание сценария в приложение также позволяет пользователю настраивать параметры конфиденциальности. Если скрипт завершается с ненулевым статусом, то приложение отображает всплывающее окно с сообщением об ошибке. В противном случае другие окна не отображаются.

Шаги приведены ниже.

  1. Используйте приложение Script Editor, чтобы создать приложение, содержащее приведенную ниже строку.

            do shell script quoted form of (POSIX path of (path to me) & "Contents/Resources/Startup.sh")
    
  2. Сохраните приложение к себе~/Applicationsпапка. (Если этой папки не существует, создайте ее.) Здесь я назову приложение «Мой агент». Вы можете выбрать другое имя.

  3. Создайте файл с именем в приложении «Мой агент».Contents/Resourcesпапка. Поместите скрипт в файл. Копия сценария из ответе Geekaristответа Гикариста приведена ниже.

            #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  4. Введите команду, указанную ниже, чтобы сделатьStartup.shисполняемый файл.

            chmod +x ~/Applications/My\ Agent.app/Contents/Resources/Startup.sh
    
  5. Сделайте приложение «Мой агент» агентом. Это предотвратит (помимо прочего) появление приложения «Мой агент» на доке во время его выполнения при запуске.

            /usr/libexec/PlistBuddy -c "Add :LSUIElement bool true" ~/Applications/My\ Agent.app/Contents/Info.plist
    

    Приведенная выше команда добавляет следующие строки в файл приложения My Agent.

                <key>LSUIElement</key>
        <true/>
    
  6. Откройте приложение «Мой агент» в приложении «Редактор сценариев». Скомпилируйте скрипт, сохраните и выйдите. Это необходимо, посколькуInfo.plistфайл был изменен вручную на предыдущем шаге.

  7. Добавьте приложение «Мой агент» в элементы входа пользователя.

I was interested in a very simple unix answer to this problem and found it at another site . Here is a summary of the solution.

The standard for login shells is to always look for the bash configuration files with "profile" in the name, in this order: /etc/profile, ~/.bash_profile, then ~/.bash_login and lastly ~/.profile. When login shells exit, they read ~/.bash_logout.

In my case I just created the ~/.bash_profile and then I opened the preferences for the Mac Terminal app and changed the "Shell opens with" option from default to /bin/bash. Вот и все. Clean and simple.

Откройте приложение «Терминал», выберите «Настройки терминала», перейдите к профилям, выберите «Профили». В разделе «Запуск» введите исходный путь к сценарию. Имя сценария.

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

nano ~/.bash_profile

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

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
Другие вопросы по тегам