Як я можу змусити Mac OS X запускати програму перед вимиканням?


9

Я намагаюся отримати Mac OS X, щоб зберегти всі мої віртуальні віртуальні віртуальні віртуальні машини при перезавантаженні. У мене вже є сценарій, який робить це, але мені потрібна OS X для автоматичного запуску цього сценарію перед перезавантаженням.

Коли Mac OS X перезавантажується, чи запускається / sbin / reboot?

Або як ще можна було цього досягти?



Це не дублікат. Я не хочу знати, як запустити сценарій чи програму під час виходу. Я хочу знати, як запустити сценарій або програму при вимкненні.
Ендрю Дж. Брем

1
Ти правий. Не точний дублікат. Відповідь у пов’язаному питанні радить користувачеві розмістити свій сценарій, /etc/rc.shutdown.localщоб запустити його під час вимкнення. Здається, це те, що ви шукаєте.
michaelmichael

Здається, цей сайт стверджує: hints.macworld.com/article.php?story=20051013141919568
Andrew J. Brehm

Метод rc.shutdown.local не працює.
Ендрю Дж. Брем

Відповіді:


5

Хоча Apple рекомендує використовувати " запуск ", найпростіше створити скрипт оболонки, використовуючи, наприклад, піко терміналу:

pico /Users/Shared/logoutHook.sh

Файл може містити щось на зразок:

#!/bin/bash
say 'Hasta la vista baby!'

Потім надайте права на виконання:

sudo chmod +x /Users/Shared/logoutHook.sh

Нарешті, підключіть сценарій до процедури виходу:

sudo defaults write com.apple.loginwindow LogoutHook /Users/Shared/logoutHook.sh

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

  • Нам може знадобитися вбити сигнал відключення для виконання того, що ми хочемо;

  • Потім надішліть новий (остерігайтеся не вбивати сигнал, надісланий нашим власним
    сценарієм)…


Якщо ви хочете зняти гачок:

sudo defaults delete com.apple.loginwindow LogoutHook

Якщо використовується " запуск ", ідеєю було б захопити сигнал SIGTERM. Подивіться на: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist


4

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

Просто запускайте скрипт і запускайте його у фоновому режимі, поки не настане час виходу.

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

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


З історичної точки зору - /sbin/rebootі рівні Darll / OS X ніколи не існували, і rc.shutdownвони застаріли разом з рештою rcтепер, яка launchdє босом. Можливо, ви зможете скористатися rc.shutdown на тигра чи раніше (у мене немає жодного з цих зображень, зручних для перевірки на даний момент) Лев, безумовно, видалив усі залишки rc.d та init.d.

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


Виявляється, "застарілий" означає "не працює". :-(
Ендрю Дж. Брем

Так - попередження розпочалися на Тигра, і я б здогадався, що воно пішло з Леопардом - важко згадати всі зміни Лева, що бігають навколо мого мозку.
bmike

Це справді ускладнює справи і робить Mac OS X дуже поганою серверною платформою.
Ендрю Дж. Брем

startd цілком здатний запускати сценарії при відключенні. Можливо, я повинен відредагувати історію і залишити цей факт більш зрозумілим. Яким чином запуску не вдається вам запустити сценарій при відключенні?
bmike

Я не знаю, як зробити запущені сценарії запуску при відключенні. Я використовую запуск для запуску речей під час завантаження.
Ендрю Дж. Брем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.