Запуск скрипта при входе в систему mac [закрыто]

280

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

У меня есть файл «Example.sh», который я хочу запустить при входе на компьютер. У меня нет проблем с его запуском, когда я уже вошел в систему, но я хочу, чтобы он запускался автоматически.

Люди говорят, чтобы добавить его в файл оболочки входа, но я не знаю, где это. Некоторая помощь, пожалуйста.

MZimmerman6
источник
3
Это не по теме ... Мне нужно было запустить мой демон Emacs;) Кстати, лучший ответ - ИМХО приложение Lingon X.
HappyFace
1
Мне все равно, если это не по теме. Это лучший ответ, который я нашел в Интернете, и он заслуживает уважения. Я игнорировал это для других в первый раз, когда искал решение, и это было большой ошибкой!
Sethmr

Ответы:

380

Следить за этим:

  • Начало Automator.app
  • Выбрать Application
  • нажмите Show libraryна панели инструментов (если скрыто)
  • добавить Run shell script(из Actions/Utilities)
  • скопируйте и вставьте ваш скрипт в окно
  • Попробуй это
  • сохранить где-нибудь (например, вы можете сделать Applicationsпапку в вашем доме, вы получите your_name.app)

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

  • добавить это приложение
  • проверить и готово;)

РЕДАКТИРОВАТЬ:

Недавно я получил значок «Хороший ответ» для этого ответа. Хотя моё решение простое и работает, самый простой способ запуска любой программы или сценария оболочки во время входа в систему описан в ответе @ trisweb , если только вы не хотите интерактивности .

С помощью автоматического решения вы можете делать следующее: приложение для входа в скриншот

Итак, запрос на запуск сценария или выход из приложения, запрос пароля, запуск других рабочих процессов автоматизатора во время входа в систему, условный запуск приложений во время входа в систему и так далее ...

jm666
источник
2
@GregMiernicki LOL, доброе утро ...;) Почти год назад добавили РЕДАКТИРОВАТЬ к моему ответу, где это тоже сказано. Но это немного проще для обычных пользователей, потому что создание файлов XML (plist) не очень удобно для многих пользователей. В любом случае - спасибо за комментарий. ;)
jm666
4
@GregMiernicki и не забывайте, что с помощью решения Automator вы можете создавать интерактивные сценарии входа в систему - например, сценарий, который попросит вас ввести некоторые данные (например, дополнительный пароль или что-то подобное). Мир не только черный или белый - по крайней мере, это как зебра ... :) :)
jm666
2
@Cupidvogel Запуск демона во время входа в систему - это именно то, что нужно для решения launchd - см. Ответ trisweb. Если вы можете управлять демоном python, вы наверняка сможете управлять конфигурационным файлом plist, в котором вы сможете управлять всеми аспектами перезапусков и т. Д.
jm666
3
Слава за указание на другой ответ, как самый чистый. Это должно получить хороший значок гражданства :).
Studgeek
2
Удивительный ответ. Выполните экспорт PATH = / usr / local / bin: $ PATH в начале скрипта, если вы хотите запускать такие команды, как «глобальное обновление composer» при запуске системы.
Леонардо
378

tl; dr: использовать встроенный в OSX модуль запуска и управления процессами launchd.

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

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

Более того launchd, статья в Википедии довольно хороша и описывает систему и ее преимущества перед другими старыми системами.


Вот конкретный файл plist для запуска скрипта при входе в систему .

Обновлен 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 - ваш единственный вариант, и, вероятно, именно поэтому он существует.

trisweb
источник
4
Да. Я нашел этот блог полезным по той же методике: developernotes.com/archive/2011/04/06/169.aspx
Даниэль Джеймс,
8
Вы не упомянули, что сомнительно в действиях Automator, и почему они «не рекомендуются».
Майк Кэмпбелл
4
Вот хороший обзор действий с папками против launchctl: apple.stackexchange.com/a/63731/38290 - И еще один об одном из ограничений LoginHook (допускается только один скрипт) - superuser.com/a/377401 . Это не совсем сомнительный или плохой метод, но launchctlв большинстве случаев он гораздо лучше и дает вам больше контроля над всеми возможными аспектами выполнения вашего скрипта. Это больше в смысле "зачем использовать менее способный метод, когда существует launchd?" (Обратите внимание, что я изменил первое предложение, чтобы указать, что лично я не рекомендую их для этой ситуации).
trisweb
3
Хотите знать, как вы создадите LaunchDaemon plist, что будет работать каждый раз, когда пользователь входит в систему? , Таким образом, не при загрузке системы, а каждый раз, когда пользователь входит в систему (попробуйте цикл logout-login). Можете ли вы показать точно (не только бла-бла), как реализовать вышеупомянутое (вы ошибаетесь) решение для автоматизатора с launchctl?
Каджвин
9
Файлы Plist в / Library / LaunchAgents / запускаются при входе в систему с идентификатором вошедшего в систему пользователя. Файлы Plist в / Library / LaunchDaemons / запускаются во время загрузки как root (id можно изменить с помощью ключа пользователя ).
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
Я связал это, единственное, чего не хватает установщику командной строки;)
сорин
1
Хорошее решение. Как я могу скрыть окно входа? Я попытался поставить галочку в пунктах входа.
xgdgsc
1
@xgdgsc: перейдите Go to System Preferences -> Accounts -> Login itemsи установите флажок скрытия для этого приложения.
Анубхава
1
@anubhava Как я уже сказал, я уже установил флажок скрытия для этого приложения для входа. Но он все еще появляется и должен быть принудительно завершен при выключении компьютера.
xgdgsc
2
@xgdgsc: О, хорошо, ты проверил ~/Library/LaunchAgentsпапку?
анубхава