Запустить скрипт оболочки при входе в Mac OS (OS X)
У меня есть этот скрипт Test.sh
:
#! /bin/bash
FILE_TO_CHECK="/Users/test/start.txt"
EXIT=0
while [ $EXIT -eq 0 ]; do
if [ -f "$FILE_TO_CHECK" ]
then
/usr/bin/java -jar myapp.jar
EXIT=1
else
sleep 30
fi
done
Мне нужно запустить этот скрипт автоматически после входа в систему.
Поэтому я положил его в папку Test
в /System/Library/StartupItems/
Когда я перезагружаю Mac, после входа в систему ничего не происходит. Есть подсказка?
Я тоже пробовал Automator
, но с тем же результатом: Java-программа не работает.
3 ответа
Вы не можете просто поместить простые сценарии в эту папку. Вам нужен "специализированный пакет", как его называет Apple, в основном папка с вашим исполняемым файлом и конфигурация .plist. И вы должны поместить его в /Library/StartupItems, так как /System/Library/StartupItems/ зарезервированы для операционной системы. Прочтите все об этом здесь:
Также обратите внимание, что весь материал помечен как устаревшая технология. И что Apple предлагает использовать launchd. Вот пример, как настроить это здесь:
https://superuser.com/questions/229773/run-command-on-startup-login-mac-os-x
Указатели Ивана Ковачевича, особенно ссылка на superuser.com, полезны; начиная с версии OS X 10.9.2, вы можете создавать сценарии запуска при входе в систему:
Примечание: методы аннотированы относительно того, являются ли они:
- специфичные для данного пользователя (" [ user-SPECIFIC ] "); т.е. установка должна быть выполнена для каждого пользователя, если это необходимо; Сценарии обычно хранятся в определенном для пользователя месте, и права root (административные) для установки НЕ требуются.
- действует для ВСЕХ пользователей (" [ ВСЕ пользователи ] "); т.е. установка вступает в силу для ВСЕХ пользователей; Сценарии обычно хранятся в общем расположении, и для установки требуются привилегии root (административные).
Сами сценарии будут работать незаметно, но - за исключением com.apple.loginwindow
метод login-hook - из них вы можете открывать приложения; на что стоит обратить внимание:
Нет никаких гарантий, что любое такое приложение будет самым передним, поэтому оно может быть скрыто другими окнами, открытыми во время входа в систему.
Если вы хотите запустить другой скрипт оболочки, просто используйте
open /path/to/your-script
, который откроет его вTerminal.app
; однако окно терминала автоматически закроется, когда ваш скрипт завершится.
Automator [ пользователь-УКАЗАНО ]:
File > New
, типApplication
- Добавить
Run Shell Script
действие, которое добавляет встроенныйbash
сценария, и либо вставьте туда свой код сценария, либо добавьте команду, которая вызывает существующий сценарий оттуда. Спасти
*.app
связать и добавить его вLogin Items
список вSystem Preferences > User & Groups > Login Items
,Замечания:
- Встроенный скрипт работает по умолчанию
"C"
локали. $PATH
фиксируется на/usr/bin:/bin:/usr/sbin:/sbin
что, в частности, не включает/usr/local/bin
- Рабочий реж. домашний каталог текущего пользователя.
- Встроенный скрипт работает по умолчанию
com.apple.loginwindow
ловушка входа [ ВСЕ пользователи - УСТАРЕЛИ, но все еще работает]:
Если у вас есть права администратора, это самый простой метод, но он УСТАРЕЛ по разным причинам (безопасность, ограниченная одним общим сценарием, синхронное выполнение); Apple особенно предостерегает от использования этого механизма как части программного продукта.
- Поместите ваш скрипт, например,
Test.sh
в общедоступном месте - например,/Users/Shared
- и убедитесь, что он исполняемый (chmod +x /Users/Shared/Test.sh
). От
Terminal.app
запустите следующее:sudo defaults write com.apple.loginwindow LoginHook /Users/Shared/Test.sh
Замечания:
Скрипт запускается от имени пользователя root, поэтому соблюдайте осторожность.
Среди методов, перечисленных здесь, это единственный способ запустить скрипт от имени пользователя root.Есть только один общесистемный хук входа в систему.
- Обратите внимание, что есть также ловушка выхода из системы,
LogoutHook
, который обеспечивает функциональность запуска при выходе из системы - в отличие от других подходов.
- Обратите внимание, что есть также ловушка выхода из системы,
Сценарий входа в систему выполняется синхронно перед другими действиями по входу в систему и поэтому должен быть коротким.
- Примечательно, что он запускается до отображения рабочего стола; вы не можете запускать приложения из скрипта, но вы можете создавать простые взаимодействия с помощью
osascript
и фрагменты AppleScript (например,osascript -e 'display dialog "Proceed?"'
); однако любые взаимодействия блокируют процесс входа в систему.
- Примечательно, что он запускается до отображения рабочего стола; вы не можете запускать приложения из скрипта, но вы можете создавать простые взаимодействия с помощью
Сценарий выполняется в контексте пользователя root, и имя пользователя, вошедшего в систему, передается сценарию в качестве 1-го аргумента.
- Скрипт работает по умолчанию
"C"
локали. $PATH
фиксируется на/usr/bin:/bin:/usr/sbin:/sbin
что, в частности, не включает/usr/local/bin
- Рабочий реж. является
/
,
агенты запуска:
launchd
-Агент-исполняемые сценарии могут быть установлены для конкретного пользователя или для всех пользователей - последний требует административных привилегий.
При использовании launchd
является предпочтительным методом Apple, это также самый громоздкий, так как требует создания отдельного *.plist
конфигурационный файл.
С другой стороны, вы можете установить несколько сценариев независимо друг от друга.
- Замечания:
- Нет конкретных сроков или последовательности
launchd
скрипты гарантированы; грубо говоря, они "запускаются одновременно при входе в систему"; нет даже гарантированного времени между пользовательскими и общепользовательскими задачами. - Скрипт работает по умолчанию
"C"
локали. $PATH
фиксируется на/usr/bin:/bin:/usr/sbin:/sbin
что, в частности, не включает/usr/local/bin
- Рабочий реж. является
/
по умолчанию, но вы можете настроить его через.plist
файл - см. ниже. - Путь к файлу сценария должен быть указан как полный, буквальный путь (например,
/Users/jdoe/script.sh
; в частности,~
пути с префиксом не работают. - Для описания всех ключей, которые могут быть использованы в
*.plist
файлы конфигурации, см.man launchd.plist
, - Как пользовательские задачи, так и задачи для всех пользователей выполняются как текущий пользователь (пользователь входит в систему).
- Нет конкретных сроков или последовательности
launchd [ user-SPECIFIC ]:
- Замечания:
Lingon 3
(5 долларов на начало 2014 года) - это приложение с графическим интерфейсом, которое облегчает процесс, описанный ниже, но только для пользовательских сценариев. - Поместите ваш скрипт, например,
Test.sh
в вашей домашней папке, например,/Users/jdoe
Создать файл с расширением
.plist
в~/Library/LaunchAgents
например,~/Library/LaunchAgents/LoginScripts.Test.plist
, запустив следующее вTerminal.app
:touch ~/Library/LaunchAgents/LoginScripts.Test.plist
Откройте файл и сохраните его со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <!-- YOUR SELF-CHOSEN *UNIQUE* LABEL (TASK ID) HERE --> <string>LoginScripts.Test.sh</string> <key>ProgramArguments</key> <array> <!-- YOUR *FULL, LITERAL* SCRIPT PATH HERE --> <string>/Users/jdoe/Test.sh</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
<!-- ... -->
комментарии указывают места для настройки; Вы можете выбрать ярлык, но он должен быть уникальным - то же самое для.plist
имя файла; для простоты оставьте метку и корень файла одинаковыми.От
Terminal.app
запустите следующее:launchctl load ~/Library/LaunchAgents/LoginScripts.Test.plist
Обратите внимание, что в качестве побочного эффекта скрипт будет выполнен сразу же. С этого момента скрипт будет выполняться всякий раз, когда пользователь CURRENT входит в систему.
- Строго не нужно бежать
launchctl load
- поскольку в силу местоположения файла он будет автоматически выбран при следующем входе в систему, но это полезно для проверки правильности загрузки файла.
launchd [ ВСЕ пользователи ]
- Поместите ваш скрипт, например,
Test.sh
в ОБЩЕМ месте, например,/Users/Shared
Создать файл с расширением
.plist
в/Library/LaunchAgents
(требует прав администратора), например,/Library/LaunchAgents/LoginScripts.Test.plist
, запустив следующее вTerminal.app
:sudo touch /Library/LaunchAgents/LoginScripts.Test.plist
Откройте файл и сохраните его со следующим содержимым (убедитесь, что ваш текстовый редактор запрашивает права администратора по запросу; в качестве альтернативы используйте
sudo nano /Library/LaunchAgents/LoginScripts.Test.plist
):<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <!-- YOUR SELF-CHOSEN *UNIQUE* LABEL (TASK ID) HERE --> <string>LoginScripts.Test.sh</string> <key>ProgramArguments</key> <array> <!-- YOUR *FULL, LITERAL* SCRIPT PATH HERE --> <string>/Users/Shared/Test.sh</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
<!-- ... -->
комментарии указывают места для настройки; Вы можете выбрать ярлык, но он должен быть уникальным - то же самое для.plist
имя файла; для простоты оставьте метку и корень файла одинаковыми.От
Terminal.app
запустите следующее:sudo chown root /Library/LaunchAgents/LoginScripts.Test.plist sudo launchctl load /Library/LaunchAgents/LoginScripts.Test.plist
Обратите внимание, что в качестве побочного эффекта скрипт будет выполнен сразу же. С этого момента скрипт будет выполняться всякий раз, когда ЛЮБОЙ пользователь входит в систему.
- Строго не нужно бежать
launchctl load
- поскольку в силу местоположения файла он будет автоматически выбран при следующем входе в систему, но это полезно для проверки правильности загрузки файла.
launchd-oneshot используется для установки скрипта в качестве запускаемого задания для запуска при входе в систему, с
brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot Test.sh --on-login