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


51

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

Відповіді:


33

Офіційно жодного з них. Запропонований Apple спосіб - це використовувати запуск . Створені для цього налаштування включають Лінгон і Контроль запуска

Що стосується файлів, які ви згадуєте, в домашньому каталозі ~ / .bashrc, ~ / profile, ~ / .bash_profile запускаються лише під час входу через термінал. Ті, що в / і т.д., управляються оболонкою, починаючи з усіх користувачів, перш ніж ті, що знаходяться в домашній директорії, але тільки тоді, коли здійснюється вхід користувача .

Запускається сценарій запуску Unix / etc / rc *, але для OSX просто використовуйте запущені речі


1
Отже, якщо моя команда вставлена ​​в будь-який з файлів у /etcній, слід запустити під час завантаження? Чи має значення, в якому воно знаходиться?
Wolfy87

1
/etc/bashrcі т. д. запускаються, коли ви запускаєте оболонку, так само ~/.bashrc- це просто те, що колишній запускатиметься кожен раз, коли будь-який користувач запускає оболонку, а не лише ваш користувач.
Скотт

@Scott є правильним. Я виправив свою відповідь
Позначте

4
Гаразд, але я просто не можу розібратися, як використовувати запуск, я спробував створити пліст-файл для своєї програми, але я не маю уявлення, як запустити його чи як змусити його запускатись при завантаженні.
Wolfy87

1
Посилання @Mark на "запуск" порушено :(
Артем

58

Щоб виконати команду при запуску в 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

Це призведе до запуску для завантаження елемента, що призведе до запуску MongoDB під час завантаження. Як бонус, він launchdбуде контролювати його, і якщо він вийде з будь-якої причини, його буде відновлено. Щоб позбутися від елемента, просто замініть навантаження у наведеній вище команді на вивантаження.


1
На цій сторінці ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) перераховано багато речей, які щось, запущене запуском, не повинно робити. Якщо я хочу запустити довільну команду при запуску, я, можливо, не буду контролювати і команда може закінчитись робити ці дії. Крім того, я, можливо, не хочу перезапускати запуск і елемент, який зупиняється, тому що це одноразовий або самостійно обробляє перезапуск. Що мені робити в цих випадках?
Майкл

@Scott, дякую. Це найкорисніша відповідь, яку я знайшов в Інтернеті.
Дмитро

5
Це спробує запускати додаток кожні 10 секунд, що добре працює для служб, які не вмирають. Якщо це для сценарію, який запускається один раз пунктуально (у моєму випадку обмін повідомленнями після вивільнення перезавантаження), додайте <key>LaunchOnlyOnce</key><true/>до дикту.
msanford

Чудова справа, містер Санфорд. запуск, який не здається, створює величезні файли журналів, які потім сповільнюють ваш Mac (завдяки постійному читанню та запису таких великих файлів журналів). Я можу використовувати це виправлення на деяких погано написаних комерційних програм, що працюють на моєму комп'ютері.
Foliovision

1
Примітка для себе: Якщо вам потрібні змінні оточення: serverfault.com/questions/111391 / ...
скрутне

47

Ще одне просте рішення від переповнення стека : Ви можете:

  • Запустіть Automator.app;
  • Виберіть "Застосування";
  • Натисніть «Показати бібліотеку» на панелі інструментів (якщо вона прихована);
  • Додати "Запустити скрипт оболонки" (з Action / Utilities);
  • Скопіюйте та вставте свій скрипт у вікно;
  • Тестуйте це;
  • Збережіть його десь: 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

Superuse-ful :-D, +1
Mukul Goel

27

Щоб запустити команди під час входу, ви можете зробити це:

  • Створіть текстовий файл, що містить ваші команди (bash script):

    #!/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
  • Додайте цей файл у Налаштування системи> Облікові записи> Елементи входу

3
найкраща та найпростіша відповідь. набагато простіше, ніж прийняте рішення. зауважте, що це в Системних налаштуваннях> Користувачі та групи> Елементи входу ... (не Облікові записи) ... а також зауважте, що файл може бути де завгодно, а також не повинен закінчуватися .cmd. просто chmod + x it.
foreyez

5
Однак елементи входу працюють під час входу, а не при запуску системи. Якщо ви запускаєте сервер, це велика різниця.
not2savvy

Ти правий @ not2savvy. Для сервера я рекомендував би відповідь @ Sridhar-Sarnobat з @reboot. Однак моя відповідь дозволить запустити графічну програму, тому я вважаю, що це корисно.
Geekarist

Чому закінчується cmdзамість sh?
Simin Jie

3

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

Ось приклад, який я знайшов у стеку Overflow, який може допомогти вам далі.



0

Мене зацікавила дуже проста відповідь Unix на цю проблему і знайшов її на іншому сайті . Ось короткий виклад рішення.

Стандартним для оболонок для входу є завжди шукати файли конфігурації bash з "профілем" у назві в такому порядку: / etc / profile, ~ / .bash_profile, потім ~ / .bash_login та нарешті ~ / .profile. Коли оболонки для входу виходять, вони читають ~ / .bash_logout.

У моєму випадку я просто створив ~ / .bash_profile, а потім відкрив налаштування програми Mac Terminal і змінив опцію "Shell opens with" з замовчуванням на / bin / bash. Це воно. Чисто і просто.


-3

відкритий термінал, тип

nano ~/.bash_profile

потім додайте цей текст у файл:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log

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