Запуск сценарію після входу в mac [закрито]


280

Мені цікаво, чи хтось може допомогти мені отримати файл .sh для запуску, коли я входжу у свій обліковий запис на своєму комп’ютері. Я працюю на Mac OS X 10.6.7.

У мене є файл "Example.sh", який я хочу запустити під час входу на комп'ютер. У мене немає проблем із його запуском, коли я вже ввійшов у систему, але хочу, щоб це запустилося автоматично.

Люди кажуть додати його до файлу оболонки для входу, але я не знаю, де це. Деякі допоможіть, будь ласка.


3
Це не поза темою ... Мені знадобилося це, щоб запустити свій демон Emacs;) До речі, найкраща відповідь - це IMHO програма Lingon X.
HappyFace

1
Мені все одно, чи це поза темою. Це найкраща відповідь, яку я знайшов в Інтернеті, і вона заслуговує на повагу. Я ігнорував це для інших, коли я вперше шукав рішення, і це була велика помилка!
Сетмр

Відповіді:


379

Дотримуйтесь цього:

  • почати Automator.app
  • виберіть Application
  • натисніть Show libraryна панелі інструментів (якщо приховано)
  • додати Run shell scriptActions/Utilities)
  • скопіюйте та вставте свій скрипт у вікно
  • перевірити його
  • збережіть десь (наприклад, ви можете створити Applicationsпапку у ГОЛОВНІЙ, ви отримаєте your_name.app)

  • перейти до System Preferences-> Accounts->Login items

  • додати цю програму
  • тест & зроблено;)

Редагувати:

Нещодавно я отримав значок "Добре відповідь" за цю відповідь. Хоча моє рішення просте і працездатне, найчистіший спосіб запустити будь-яку програму або скрипт оболонки під час входу описаний у відповіді @ trisweb , якщо ви не хочете інтерактивності .

За допомогою рішення автоматизації ви можете робити наступні дії: додаток для входу в скриншот автоматизатора

тож, запитуючи запустити скрипт або вийти з програми, задати паролі, запустити інші робочі процеси автоматизатора під час входу, умовно запустити програми під час входу тощо.


2
@GregMiernicki LOL, доброго ранку ...;) Майже рік тому додав до моєї відповіді EDIT, де теж розповідав про це. Але це трохи простіше середніх користувачів, оскільки створення XML (plist) файлів не дуже зручно для багатьох користувачів. У всякому разі - подяку за коментар. ;)
jm666

4
@GregMiernicki і не забувайте, за допомогою рішення Automator ви можете створити ІНТЕРАКТИВНІ скрипти для входу - наприклад, сценарій, який запитає вас про якийсь запис (наприклад, додатковий пароль або щось подібне). Світ не лише чорний чи білий - принаймні, це як зебра ... :) :)
jm666

2
@Cupidvogel Запуск демона під час входу - це саме завдання для запущеного рішення - див. Відповідь trisweb. Якщо ви можете керувати демоном python, ви впевнені, що можете керувати файлом конфігурації plist, де ви можете керувати всіма аспектами перезапуску і так далі ...
jm666

3
Кудо для того, щоб вказати іншу відповідь як найчистішу. Це має отримати хороший знак громадянства :).
studgeek

2
Дивовижна відповідь. Експортуйте PATH = / usr / local / bin: $ PATH, на початку сценарію, якщо ви хочете запускати команди на зразок "composer global update" під час запуску системи.
Леонардо

377

ТЛ; ін: рідний процес запуску і менеджер використання OSX, в launchd.

Для цього складіть launchctlдемон. Ви будете мати повний контроль над усіма аспектами сценарію. Ви можете бігти один раз або залишатися живим, як демон. У більшості випадків це шлях.

  1. Створіть .plistфайл відповідно до інструкцій у документах Apple Dev тут або більш детально нижче.
  2. Місце в ~/Library/LaunchAgents
  3. Увійти (або запустити вручну через launchctl load [filename.plist])

Більш докладної інформації про launchd, Вікіпедія стаття досить добре і описує систему і її перевага по порівняно з іншими більш старими системами.


Ось конкретний файл плісту для запуску сценарію при вході .

Оновлено 2017/09/25 для OSX El Capitan та новіших версій (кредит Жозе Месіясу молодшого ):

<?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>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Замініть <string>післяпрограмний ключ на бажану команду (зауважте, що будь-який скрипт, на який посилається ця команда, повинен бути виконаним: chmod a+x /path/to/executable/script.shщоб переконатися, що він призначений для всіх користувачів).

Зберегти як ~/Library/LaunchAgents/com.user.loginscript.plist

Запустіть launchctl load ~/Library/LaunchAgents/com.user.loginscript.plistі вийдіть / увійдіть, щоб протестувати (або тестувати безпосередньо, запустити launchctl start com.user.loginscript)

Хвіст /var/log/system.logдля повідомлень про помилки.

Ключовим моментом є те, що це запускається запис, визначений для користувача, тому він буде виконуватися при вході для даного користувача. Демони запуску (поміщені в систему /Library/LaunchDaemons) для системи запущені під час завантаження.

Якщо ви хочете, щоб сценарій запускався для входу для всіх користувачів, я вважаю, що LoginHook - це ваш єдиний варіант, і це, мабуть, причина його існування.


4
Так. FWIW Я вважаю цей блог тією ж технікою корисною: developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
Ви нехтуєте згадкою про те, що сумнівно стосується дій Автоматизатора, і чому вони "не рекомендуються".
Майк Кемпбелл

4
Ось хороший огляд дій папок проти запуску : apple.stackexchange.com/a/63731/38290 - та ще одне про одне з обмежень LoginHook (дозволений лише один сценарій) - superuser.com/a/377401 . Дійсно, що це або сумнівний або поганий метод, але launchctlпросто набагато кращий у більшості випадків і дає більше контролю над усіма можливими аспектами запуску сценарію. Це більше в сенсі "навіщо використовувати менш спроможний метод при запуску?" (Зауважте, я змінив перше речення, щоб вказати, що я особисто не рекомендую їх для цієї ситуації).
trisweb

3
Цікаво, як ви створите LaunchDaemon plist, що буде працювати щоразу, коли користувач увійде в систему? . Отже, не тоді, коли система завантажується, а щоразу, коли користувач входить у систему (спробуйте з циклом вихід-вхід). Чи можете ви, будь ласка, показати точно (не тільки бла-бла), як реалізувати вищезазначене (ви неправильно) рішення автоматизатора за допомогою startctl?
cajwine

9
Файли списків у / Бібліотеці / LaunchAgents / запускаються при вході в систему з ідентифікатором зареєстрованого користувача. Файли списків у / Бібліотеці / LaunchDaemons / запускаються під час завантаження як root (ідентифікатор можна змінити за допомогою ключа користувача ).
bain

42
  1. Створіть свій скрипт оболонки, як login.shу папці $ HOME.

  2. Вставте такий однорядковий сценарій в редактор сценаріїв:

    виконувати скрипт оболонки "$ HOME / login.sh"

  3. Потім збережіть його як додаток.

  4. Нарешті додайте додаток до елементів входу.

Якщо ви хочете зробити вихідний сценарій візуальним, ви можете змінити крок 2 для цього:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Якщо потрібно кілька команд, можна використовувати щось подібне:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

1
Я пов’язав це, єдине, чого не вистачає встановнику командного рядка;)
sorin

1
Приємне рішення. Як я можу приховати вікно "логін"? Я спробував позначити елементи входу.
xgdgsc

1
@xgdgsc: Перейдіть Go to System Preferences -> Accounts -> Login itemsта поставте прапорець приховати цей додаток.
anubhava

1
@anubhava Як я вже говорив, я вже поставив прапорець приховати цю програму для входу. Але воно все ж з’являється і його потрібно змусити відмовитися від вимкнення комп’ютера.
xgdgsc

2
@xgdgsc: Добре, ви перевірили ~/Library/LaunchAgentsпапку?
anubhava
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.