Как я могу принудительно выключить свой Mac в назначенное время?

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

Наиболее важной частью этого является то, что выключение нельзя отменить (если только процесс не является чрезвычайно обременительным).

Что вы подразумеваете под "приложением"? Должна ли это быть программа с графическим интерфейсом или запуск (что я предлагаю ниже) приемлем? Если вы делаете приложение с графическим интерфейсом, что вы хотите, чтобы оно делало? Подскажите время, на которое компьютер должен быть выключен, при запуске?
Можете ли вы объяснить немного больше о сценарии? Какая модель Mac и ОС? Почему важно выключение; как вы определяете «обременительную» задачу? Вы согласны с потерей несохраненных данных или хотите попытаться сохранить и закрыть все приложения?
@benwiggy Мне просто нужно убедиться, что у меня приличный график сна. Иногда я «занимаюсь чем-то» или мне нужно «смотреть важное видео на YouTube». Но эти оправдания на самом деле никогда не бывают достаточно хороши, чтобы отсрочить время сна. Однако, если автоотключение можно отключить, у меня возникает соблазн пойти и отключить его. Я хочу избежать этого искушения. Я в порядке с потерей несохраненных данных.
@benwiggy В настоящее время я использую 27-дюймовый Intel imac 2019 года. Я думаю, что все, что связано с графическим интерфейсом, будет считаться «необременительным».
У меня также проблемы со сном, поэтому я считаю, что вам нужен старый добрый будильник, подальше от компьютера. У меня есть два ключевых момента: один, чтобы принять лекарство, и другой, чтобы изучить 5 минут Duolingo до полуночи (иначе я потеряю свою серию из 750+ дней). Итак, после этого я смотрю 30-минутный ситком в постели на своем телефоне с минимальной яркостью, и если я все еще не достаточно сонный, хорошая комедия сделает свое дело, потому что я могу слушать с закрытыми глазами.
@ Гарри, как предлагается ниже, Power Manager работает с последней версией macOS и продолжает поддерживаться. Предположительно, вы ищете бесплатный подход?
@MateusRibeiro слишком легко игнорировать будильник, потому что я чертов идиот.
@ Гарри, лол, мне нужно встать со стула, иначе звук сведет меня с ума.

Ответы (7)

Итак, в дополнение к моему предыдущему ответу я могу помочь вам заставить cron (встроенную службу расписания UNIX) запустить для вас запланированную команду завершения работы.

Он будет работать как root и будет принудительно.

  • Откройте терминал (/Приложения/Утилиты/Терминал)
  • Входsudo crontab -e

Вам нужно будет ввести пароль для входа в систему, а затем нажать Enter.

Теперь вы будете в текстовом редакторе (vim). Внимательно введите следующие нажатия клавиш.

  • Нажмите iодин раз (это позволит вам ввести текст)

Допустим, вы хотите, чтобы машина выключалась в 2 часа ночи каждый день, теперь мы должны ввести:

* 2 * * * /sbin/shutdown -h now

Если вы хотите, чтобы машина выключалась каждый день в 2:30, вы должны ввести:

30 2 * * * /sbin/shutdown -h now
  • Когда вы введете это, нажмитеesc
  • Затем нажмите shift+ z shift+ z(это дважды заглавная буква «z», чтобы записать изменения и выйти из редактора)

Теперь вы должны вернуться в командную строку, с которой вы начали.

Готово!

Не надо туда ставить sudo? Я знаю, что это, вероятно, приведет к зависанию, но я почти уверен, что вы должны быть root, чтобы запустить shutdown.
Никаких исключений не нужно, это потрясающий ответ, очень приятно удивлен, особенно после того, как я грубо ответил на ваш вопрос. Большое спасибо за Вашу помощь
@daveisgeek - Вы совершенно правы, но обратите внимание, что мы запускаем crontab с помощью sudo. Это означает, что мы редактируем crontab root, и поэтому любые запланированные команды внутри будут выполняться от имени этого пользователя.
Эй, я сделал это, и в назначенное время у меня появилось диалоговое окно, в котором говорится, что этот компьютер выключится через 10 минут? И просит отменить. Я не знаю, было ли это результатом cron или энергосбережения, которое я тоже сделал. Предполагается ли, что cron принудительно завершает работу без диалога отмены?
У вас не должно быть диалога. Отключите расписание в настройках энергосбережения, это, вероятно, показывает сообщение. Тогда это просто случай ожидания времени отключения cron :)
Вот как выглядит мой crontab: cl.ly/363p2J3M3F2x0q042x1c Сейчас 22:30? Просто прошло и ничего не произошло.
shutdownнаходится в /sbinкотором, вероятно, нет в $ PATH по умолчанию для cron. Чтобы исправить это, сделайте sudo crontab -eэто еще раз, введите ddудалить строку (при условии, что файл выглядит так же, как тот, который вы указали выше) и повторно введите строку как 30 22 * * * /sbin/shutdown -h now.
@patrix Лучший чувак, я пропустил /sbin/! Это работает сейчас :)
Как отменить этот кронтаб?
да, как вы можете отменить это, если вы больше не хотите этого делать?
@Johnykutty и @user3314418: отредактируйте файл cron ( sudo crontab -e) и удалите добавленную вами строку выключения, затем сохраните.
Будет ли этот ответ работать, даже если машина спит?
10 лет спустя... ЭТОТ ОТВЕТ БОЛЬШЕ НЕ РАБОТАЕТ! Теперь он автоматически перезагружается вместо чистого выключения.
@Harry Комментарии здесь не сохраняются и могут исчезнуть. Ваше наблюдение полезно. Чтобы сохранить его, опубликуйте неработающую информацию в новом ответе.
@Гарри Что изменилось? Предполагая, что ваше оборудование или ОС изменились с момента первоначального ответа, можете ли вы поделиться более подробной информацией о версии ОС и т. д.? (Это все еще работает для меня на x86 MBP под управлением macOS 12.3)

Однако его можно отменить:


Остановка в yymmddhhmm:

shutdown -h 1109211555

Остановка через 4 минуты:

shutdown -h +4

/Library/LaunchAgents/me.lri.forceshutdown.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>me.lri.forceshutdown</string>
    <key>ProgramArguments</key>
    <array>
        <string>shutdown</string>
        <string>-h</string>
        <string>now</string>

    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>23</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

Если бы plist принадлежал обычному пользователю, попытка загрузить его привела бы к ошибке launchctl: Dubious ownership on file (skipping):

sudo chown root /Library/LaunchAgents/me.lri.forceshutdown.plist

Агент можно загрузить, выйдя из системы и снова войдя, или с помощью:

sudo launchctl load /Library/LaunchAgents/me.lri.forceshutdown.plist

sudo crontab -e

`08 16 * * * /sbin/shutdown -h now`

Это выполнит обычное непринудительное отключение:

osascript -e 'tell app "System Events" to shut down'
При добавлении команды выключения к агенту запуска в /Library/LaunchAgents/ она не работала, и «консоль» регистрировала «выключение: НЕ суперпользователь». Возможно, это сработало бы в /System/Library/LaunchAgents (но вы не должны помещать туда что-то :-)) Мне нужно было только нормальное завершение работы, поэтому я пошел с osascript и поместил его в ~/Library/LaunchAgents /bla.shutdown.plist. Работал нормально.
Мне пришлось использовать <code>osascript -e 'сказать приложению "Finder" закрыться"</code>
Это единственный правильный ответ. (я считаю)

Это можно запланировать в Системных настройках > Экономия энергии > Расписание . Я не уверен, что это инициирует принудительное отключение, вам нужно попробовать. Но это встроенная опция для автоматизации запланированного отключения/включения питания.

  • Вы также можете принудительно завершить работу системы с помощью терминальной команды (требуется root):

    выключить -h сейчас

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

  • Вы также можете проверить приложение, такое как метко названное iWannaSleep (не уверен, что это приведет к отключению).

Что...??? Я ищу приложение.
Вы можете показаться менее неблагодарным, но если вы перечитаете мой ответ, вы увидите, что я рекомендую приложение, и если вы проведете небольшое независимое исследование, вы увидите, что на самом деле есть еще несколько приложений, которые имеют эту возможность!
iWannaSleep — это первый результат, который люди рекомендуют в Google, и он не делает того, что я хочу. И вы рекомендуете мне научиться чему-нибудь в Unix, чтобы выключить компьютер?
Нет, я благодарен за вашу помощь, просто ваша помощь совершенно сбивает с толку.
Я рекомендую его, потому что это эффективный способ добиться желаемого с помощью встроенных инструментов. Если вы не можете найти приложение, которое соответствует вашим потребностям, возможно, вам придется поискать что-то похожее на мое предложение.
Энергосбережение » Расписание не является хорошим ответом, потому что оно подскажет пользователю за 10 минут до выключения и предложит отменить процесс.

Вы можете shutdownнапрямую запланировать отключение в любое время в будущем:

shutdown -h time

где время указывает будущее время в одном из двух форматов: +число или ггммддччмм, где год, месяц и день могут быть по умолчанию равны текущим системным значениям. Первая форма останавливает систему в минутах, а вторая — в указанное абсолютное время.

Более приятное запланированное отключение

Если вы хотите безопасно выключить свой Mac в запланированное время, рассмотрите Power Manager ; он прекрасно закрывается, не позволяя приложениям блокировать процесс:

  • Все активные пользователи получают достаточное уведомление.
  • Незадолго до начала выключения отображается большое предупреждение.
  • Запущенные приложения вежливо просят выйти.
  • Приложения, игнорирующие приятный запрос, более жестко закрываются.
  • Выход из системы остается завершить, прежде чем Mac окончательно выключится.

Мошенническому приложению или процессу очень сложно заблокировать эти шаги.

Почему бы нетshutdown

Использование shutdownзаставит закрыть все процессы на вашем Mac, включая графические приложения. Для многих приложений это агрессивное поведение, которое не дает приложению особых возможностей для сохранения состояния или данных.

Помощник по расписанию

Power Manager включает задачу Schedule Assistant для выключения по расписанию .

Power Manager - отключить ежедневную задачу

Раскрытие информации: я работаю с компанией, которая производит Power Manager.

cd ~/Downloads/

curl --remote-name http://dl.dropbox.com/u/18414/ase/com.tjluoma.forceshutdown.plist

# см. примечание ниже

sudo mv com.tjluoma.forceshutdown.plist /Library/LaunchAgents

sudo chown root:wheel /Library/LaunchAgents/com.tjluoma.forceshutdown.plist

sudo launchctl load /Library/LaunchAgents/com.tjluoma.forceshutdown.plist

Примечание:

Как написано, plist заставит компьютер выключаться в 23:00 (по местному времени) каждый день.

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

<dict>
    <key>Hour</key>
    <integer>23</integer>
    <key>Minute</key>
    <integer>0</integer>
</dict>

(обратите внимание на использование 24-часового времени)

Я бы взглянул на эту техническую заметку Apple

вы можете использовать SendAppleEventToSystemProcess(kAEShutDown), затем вы можете использовать команду killall -u username, чтобы убить все приложения (поскольку вы не хотите, чтобы ее можно было отменить), вы также можете проверить класс таймера: developer.apple.com/library/ mac/#документация/Какао/Справочник/…
Отличная статья, но OP возражал против использования cron или launchd, я сомневаюсь, что он хочет написать собственное решение этой проблемы.
Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.