Запустити сценарій при виході без використання гачка виходу


11

Я розглядав виконання декількох команд очищення, коли користувач виходить із системи, проте стара функція гака виходу, хоча і досі функціонує, вже деякий час застаріла, тому, можливо, не буде з нами довше.

На жаль, хоча launchdнадає зручну альтернативу гакам для входу, немає такої очевидної заміни для гачків виходу.

Я вже експериментував зі створенням сценарію оболонки, який запускається при вході в систему і просто спить, поки не буде отримано сигнал вбивства, однак це, здається, не працює (сценарій ніколи не отримує сигнал під час нормальної роботи).

Інакше я не впевнений, який найкращий спосіб запустити швидку команду при виході? Я знаю, що є деякі сторонні утиліти, які можуть це зробити, але чи є "правильний" спосіб це зробити вже?

Відповіді:


7

Схоже, Apple не зацікавлена ​​в заміні гака виходу, оскільки вони закрили мою проблему, запитуючи про одну.

Однак одне з удосконалень Yosemite полягає в тому, що запущений зараз належним чином передає сигнали до скриптів оболонки. Це означає, що тепер ви можете виконувати такі завдання, як:

Ось приклад logout.sh:

#!/bin/sh
onLogout() {
    echo 'Logging out' >> ~/Logs/logout.sh.log
    exit
}

trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
    sleep 86400 &
    wait $!
done

Це буде просто спати (асинхронно, робити це синхронно без амперсанда, здається, не буде), поки він не отримає один із захоплених сигналів, і в цей момент він виконає onLogoutфункцію.

Все, що вам потрібно зробити, це запустити цей скрипт за допомогою RunAtLoadагента запуску або демона запуску, і він буде працювати при виході або відключенні, хоча важливо мати на увазі, що завдання мають лише обмежений час, перш ніж вони будуть вбиті замість цього , тому це не повинно використовуватися для запуску нічого, що займає тривалий час, або вимагає підключення до мережі, яке може затриматись тощо.

Звичайно, це не приносить користі ні для кого з Мавериків чи раніше, але під Йосеміті це тепер, здається, працює так, як очікувалося; тож я насправді робив це в першу чергу правильно, launchdпросто не надсилав сигнали належним чином :)

ПРИМІТКА. Для роботи скриптів оболонки, здається, потрібно виконувати безпосередньо запуск, тобто не слід викликати через sh. Отже, якби це було розміщено у ~/Library/Scripts/foo.shвашій програмі, аргументи можуть виглядати так:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>

Коли я запускаю цей сценарій, він повертається line 8: syntax error near unexpected token ;'(з могилою до напівколонки)
Jason

Упс, ти маєш рацію @Jason, я думаю, що я надто спростив це, я підробив це, щоб більше нагадувати робочий приклад.
Харавік

Він спрацьовує, коли я вивантажую його за допомогою startctl, але не тоді, коли виходжу з системи або перезапускаю. Чому?
Трелліс

Чи є спосіб запустити її до того, як мережа вийде з ладу?
Філіппо

2

Ви можете використовувати iHook для запуску гачків для входу / виходу, які, як я виявив, все ще працюють для неінтерактивних гачків для входу та виходу, написаних на Bash та Python на Yosemite.

http://rsug.itd.umich.edu/software/ihook/


На жаль, цей все ще використовує звичайні гачки виходу під капот.
0942v8653

0

Якщо інші, хто потрапляє сюди з пошукових систем, не переймаються використанням гачка виходу, запустіть, наприклад:

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

Потім ~/.logouthookвиконується наступний раз, коли ви виходите з системи.

Значенням LogoutHookключа повинен бути шлях до виконуваного файлу, а не команди оболонки. У defaultsКоманді модифікує /var/root/Library/Preferences/com.apple.loginwindow.plist.


Дякую, що все-таки надаєте його як альтернативу, але я занепокоєний тим, що гачки входу та виходу були застаріли в останніх кількох версіях ОС X; хоча я сподіваюся, що вони все ще функціонують в Yosemite (оскільки він в основному зосереджений на змінах інтерфейсу користувача та безперервності), схоже, він може перейти в будь-який час, як і старі елементи запуску, які замінюються launchd, просто ганьба у нього немає RunBeforeUnloadабо подібний варіант .
Харавік

0

Я також не можу змусити елемент запуску виходу працювати 10.10.1, але ключ LogoutHook у корінці "com.apple.loginwindow.plist" працює добре. Чи є інші приклади для методу запуску?

У всякому разі, я написав AppleScript, щоб знищити системний обсяг при виході, щоб звуковий сигнал запуску не був почутий при наступному запуску. Що я не розробив, це деталі щодо керування кількома командами виходу на основі однієї клавіші LogoutHook або можливо збереження декількох ключів LogoutHook, тому мене все ще цікавить метод Launchd, яким можна керувати за допомогою Lingon, або навіть Lingon 3, який має набагато вужчу сферу, ніж оригінал (імовірно, існує в магазині додатків).

встановіть current_Vol на (зробіть скрипт оболонки "osascript -e \" вихідний об'єм (отримати налаштування гучності) \ "")
якщо кнопка повернута (діалогове вікно "Ви хочете приглушити звуковий сигнал запуску, відновити його чи скасувати?" Кнопки {"Тиша", "Відновити", "Скасувати"} кнопка за замовчуванням 1) - "мовчання", то
    зробіть скрипт оболонки "mkdir -p / usr / local / logouttask; echo '#! / bin / bash
# скрипт виходу
osascript -e \ "встановити об'єм 0 \" '> / usr / local / logouttask / logoutscript; sudo за замовчуванням написати com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutscript; chmod + x / usr / local / logouttask / logoutscript "з правами адміністратора
ще
    спробуйте
        виконувати скрипт оболонки "sudo defaults write com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutscript" з правами адміністратора
        діалогове вікно "Звуковий сигнал запуску пролунає, якщо налаштування гучності перевищує 0 при вимкненні або перезапуску" кнопки {"OK"} кнопка за замовчуванням 1
    на помилку номер_помилки_ помилка__ число помилок
        якщо error_number дорівнює 1, то
            діалогове вікно "Сценарій, який встановлює об'єм системи на нуль при виході, не існує. Звук запуску пролунає, якщо налаштування гучності перевищує 0 при вимкненні або перезапуску." кнопки {"OK"} кнопка за замовчуванням 1
        ще
            відобразити діалогове вікно "Помилка:" & число_помилки & "." & кнопки_повідомлення про помилку {"ОК"} кнопка за замовчуванням 1
        закінчується, якщо
    завершити спробу
закінчується, якщо

Як ви викликаєте елемент виходу? Мій приклад оболонки скрипту для потреб потрібно викликати безпосередньо (без використання sh), тому він повинен бути файлом, який виконується, я зазначу це у своїй відповіді.
Харавік

Дякуємо за оновлення. Я спробую якомога швидше повідомити вас.
Трелліс

Я можу викликати подію, що міститься у foo.sh, лише запустивши "startctl unload" на плісті, який викликає його у Terminal. Вихід із системи не викликає цього.
Трелліс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.