Сделать скрипт / приложение запущенным при выходе

13

Мы все знаем, что в Mac OS X есть очень полезная функция « Элементы входа», которая позволяет, помимо прочего, настраивать приложения / скрипты, запускаемые при входе в систему.

Я ищу способ настроить список скриптов / приложений, которые запускаются при выходе из системы . Список «Выйти из системы», если хотите.
По сути, я хочу написать несколько небольших сценариев очистки для себя, которые будут запускаться автоматически при выходе из системы или завершении работы.

Итак, я ищу способ, чтобы скрипт (или, в идеале, список) автоматически запускался при выходе из системы. Выход из системы будет ожидать завершения сценариев (точно так же, как выход из системы ожидает, когда вы нажмете кнопку «Сохранить», если приложение запросит его).

Есть ли способ автоматически запускать (а) сценарий (и) при выходе из Mac OS X?

Натан Гринштейн
источник

Ответы:

7

Крюки выхода из системы устарели в 10.4 , но они все еще работают с 10.9.

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nsay a' > ~/.logouthook
chmod +x ~/.logouthook

Значением ключа LogoutHook может быть только путь к исполняемому файлу, но не команда оболочки. Хук выхода из системы запускается от имени пользователя root.

Команда defaults изменяет /var/root/Library/Preferences/com.apple.loginwindow.plist. Добавление ключа LogoutHook в /Library/Preferences/com.apple.loginwindow.plist не работает.

Если хук выхода из системы занимает достаточно много времени, отображается серый экран, пока хук выхода из системы не завершится. Похоже, не существует какого-либо временного ограничения, после которого хуки выхода из системы вынуждены завершаться.

Я не нашел никакого способа надежного запуска программ при выходе из системы с помощью launchd. Когда я пытался перехватывать сигналы, такие как EXIT, код в ловушке запускался только при выходе из окна входа в систему, а не при выключении или перезапуске.

<?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>test</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-c</string>
    <string>trap 'echo a>/Users/username/Desktop/a;say a' EXIT;while :;do sleep 10;done</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
LRI
источник
Хм, ни один из них не работал для меня. У меня есть этот скрипт , который работает, если я запускаю его sh(он создает этот файл .txt). Я сохранил скрипт как /etc/rc.shutdown.local и добавил его, defaultsкак вы сказали. Ни один файл не был там уже. Я делаю что-то неправильно? Благодарность!
Натан Гринштейн
Я не уверен, что делаю что-то не так или нет. Я на 10.6.8 и LogoutHook не работает. Я был бы признателен, если бы вы могли взглянуть на этот скриншот и сообщить мне, если что-то выглядит не так. Благодарность!
Натан Гринштейн
1
Ах! Этот последний сделал свое дело на 10.6.8. Благодарность! Одно замечание: это не работает со Львом :(
Натан Гринштейн
2
Оба метода отлично работают на моей машине Mountain Lion (10.8.2), даже при выключении или перезагрузке. Обратите внимание, что хуки LoginHook / LogoutHook выполняются в контексте пользователя root , и что они являются одиночными, общесистемными хуками, и что хук входа в систему запускается синхронно - намного раньше, чем агенты запуска для каждого пользователя; аналогично, ловушка выхода из системы запускается раньше, чем агент запуска для каждого пользователя, который использует метод EXIT-trap. Есть случаи, когда работают только крючки; Например, если вы хотите отключить звук при выключении, чтобы подавить звук при запуске Mac, надежно работает только LogoutHook.
mklement0
1

На самом деле есть способ:

  1. Откройте приложение «Редактор скриптов»
  2. Вставить

do shell script "PUT YOUR START SCRIPT PATH HERE"

on quit
    do shell script "PUT YOUR STOP SCRIPT PATH HERE"
    continue quit
end quit
  1. Файл> Сохранить, Выбрать приложение и Оставаться открытым после запуска обработчика и Сохранить
  2. Системные настройки> Пользователи и группы> вкладка «Элементы входа»> кнопка «+»
  3. Добавьте приложение и отметьте его как скрытое

Чтобы скрыть это от дока:

  1. Щелкните правой кнопкой мыши приложение и выберите Показать содержимое пакета.
  2. Откройте Info.plist и добавьте

<key>NSUIElement</key>
<string>1</string>
Filippo
источник
Люблю это. Просто и адекватно для моих нужд. И не осуждается.
Иван Икс
0

Script Timer - хороший выбор для этого. Он может работать при выходе из системы, входе в систему и многом другом. Я бы пошел с этим для простого и удобного решения. У него простой графический интерфейс:

Триггерное действие

Есть две вещи, которые вы должны отметить о Script Timer. Во-первых, это не бесплатно. Это стоит 12 долларов, но я лично думаю, что оно того стоит. Во-вторых, он не полностью совместим с Lion, но они пообещали бесплатное обновление, как только сделают его совместимым.

daviesgeek
источник
1
Сейчас это устарело
Киртикумар А.
0

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

svth
источник
0

Power Manager может запускать скрипт, когда пользователь выходит из системы. Это коммерческий продукт, и он поддерживает последние версии MacOS.

Power Manager запускает скрипт при выходе из системы.

Более ранние версии требовали использования редактора событий , но теперь включена задача «Помощник по расписанию» для запуска сценариев при входе и выходе из системы.

Я написал Power Manager, поэтому не стесняйтесь задавать технические вопросы о его реализации. В случае событий, вызванных выходом из системы, Power Manager не запрашивает изменения состояния пользователя, а уведомляет macOS об изменениях пользователя. Этот подход более эффективен, чем использование скриптов в цикле / опросе.

Грэм Милн
источник