Запустить скрипт оболочки при входе в 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/ зарезервированы для операционной системы. Прочтите все об этом здесь:

https://developer.apple.com/library/mac/documentation/macosx/conceptual/bpsystemstartup/chapters/StartupItems.html

Также обратите внимание, что весь материал помечен как устаревшая технология. И что 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
Другие вопросы по тегам