Запустить скрипт перед перезагрузкой/выключением

Можно ли выполнить сценарий/команду прямо перед выключением или перезапуском OS X?

Я хотел бы запустить, sudo apachectl stopчтобы остановить автоматический запуск apache.

Этот вопрос здесь касается выключения / перезапуска, вопрос связан с комментарием о выходе из системы. Это разные сценарии, поэтому давайте пока оставим вопросы отдельно.

Ответы (2)

Вы можете использовать хук выхода:

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

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

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

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

Перехватчики выхода из системы устарели в версии 10.4, но я не нашел способа надежно запускать программы при выходе из системы с помощью launchd. У меня тоже не работает rc.local.shutdown. Я не знаю, как запустить хук выхода из системы перед выключением или перезапуском, но не перед выходом из системы.

Если вы хотите, чтобы Apache перестал запускаться с вашего компьютера при загрузке, вы, вероятно, захотите выгрузить соответствующий .plist с помощью launchctl:

Откройте терминал, затем
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

ты имел ввиду /usr/sbin/apachectl?
apachectl stopпросто работает launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plistна OS X. См cat /usr/sbin/apachectl. .
Хотя это не отвечает на заданный вопрос, это лучшее решение проблемы. Удалите .plist, и Apache больше не будет запускаться при загрузке.