1

Я использую следующий скрипт

<?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>
    <string>my.script.keeprunning</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
       <string>/path/to/file</string>
    </array>
</dict>
</plist>

запускать приложение даже в случае его сбоя, но после перезапуска системы фокус переключается на это конкретное приложение. Как я могу улучшить скрипт для запуска приложения скрытым или свернутым? Будет ли легче написать applecript для него и запустить его как сервис?

Спасибо вам за ваши предложения ;)

2 ответа2

0

Например, сохраните этот список как ~/Library/LaunchAgents/some.label.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>
  <string>some.label</string>
  <key>ProgramArguments</key>
  <array>
    <string>lsappinfo</string>
    <string>launch</string>
    <string>launchandhide=true</string>
    <string>nofront=true</string>
    <string>/Applications/Mail.app</string>
  </array>
  <key>StartInterval</key>
  <integer>60</integer> <!-- run the program every 60 seconds -->
</dict>
</plist>

Затем запустите launchctl load ~/Library/LaunchAgents/some.label.plist .

Вы также можете использовать open -jga Mail или pgrep -qx Mail||open -jga Mail вместо lsappinfo launch launchandhide=true nofront=true /Applications/Mail.app . open -jg открывает приложение скрытым и не делая его первым, за исключением того, что для некоторых приложений, таких как Mail и TextEdit, оно создает новое видимое окно, если приложение работает, но не имеет открытых окон. Для этих приложений вы можете использовать pgrep чтобы проверить, открыто ли уже приложение.

lsappinfo был добавлен в 10.9. open -j и pgrep были добавлены в 10.8.

0

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

on idle
    tell application "System Events"
        set pName to the name of every process
        if pName does not contain "MY APPLICATION" then
            do shell script "open -g /Applications/MY APPLICATION.app"
                                        -- or wherever your application is
        else if pName contains "MY APPLICATION" then
            set makeFalse to visible of window 1 of application "MY APPLICATION"
            if makeFalse is true then set visible of window 1 of application "MY APPLICATION" to false
        end if
    end tell
end idle

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

После запуска скрипт выполнит следующее:

  • Проверьте запущенные процессы, чтобы увидеть, открыто ли ваше приложение.
  • Если вашего приложения нет в списке, оно откроет его в фоновом режиме с помощью do shell script "open -g command.
  • Если приложение открыто, оно будет скрывать главное окно.
  • Обработчик on idle будет автоматически проверять каждые 30 секунд. Если вы хотите увеличить задержку, вы можете добавить return а затем количество секунд, которое вы бы хотели, чтобы скрипт ждал, прежде чем проверять снова (например, return 300 течение пяти минут). Это должно быть добавлено до end idle

Я использую эту информацию, чтобы скрыть значок док-станции для приложения и полностью запустить его в фоновом режиме.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .