如何在指定时间强制关闭我的Mac?

我正在寻找一款能在指定时间强制关闭计算机的自动关机应用程序。

最重要的部分是关机不能被取消(除非过程极其繁琐)。


你说的“app”是什么意思?必须是一个图形用户界面程序吗?还是使用launchd(我在下面建议的方式)可以接受?如果你需要一个图形用户界面应用程序,那你希望它能做什么呢?在运行时提示输入计算机关机时间吗? - TJ Luoma
你能再详细解释一下情景吗?使用的是什么款式和操作系统的Mac电脑?为什么关机很重要?你如何定义“繁琐”的任务?你是否可以接受丢失未保存的数据,还是希望尝试保存并退出所有应用程序? - benwiggy
@benwiggy 这只是确保我有一个合理的睡眠时间表的问题。有时候我会“忙于某事”或者必须“看一个重要的YouTube视频”。但这些借口实际上从来都不足以延迟就寝时间。然而,如果自动关机是可以关闭的,我很想去关闭它。我想避免这种诱惑。我可以接受丢失未保存的数据。 - Harry
@benwiggy 我目前使用的是一台27英寸2019年款Intel iMac。我认为任何带有图形用户界面的东西都不会被视为“繁琐”。 - Harry
1我也有睡眠问题,所以我相信你需要一个老式的闹钟,远离电脑。我有两个关键时刻,一个是吃药的时间,另一个是在午夜之前学习5分钟的Duolingo(否则我会失去750多天的连胜纪录)。之后,我在床上用手机看30分钟的情景喜剧,亮度调到最低,如果还不够困,一场好的单口喜剧可以解决问题,因为我可以闭着眼睛听。 - Mateus Ribeiro
@Harry,如下所建议,Power Manager 兼容最新版本的 macOS,并且仍然得到支持。你可能在寻找一个免费的解决方案吗? - Graham Miln
@MateusRibeiro 这太容易忽视闹钟了,因为我是个该死的白痴。 - Harry
@Harry 哈哈,我得从椅子上站起来,不然这声音会把我逼疯的。 - Mateus Ribeiro
7个回答

好的,继续之前的回答,我可以指导你如何使用cron(内置的UNIX计划服务)来运行定时关机命令。 它将以root身份运行,并且会被强制执行。
  • 打开终端(/Applications/Utilities/Terminal)
  • 输入sudo crontab -e
您需要输入登录密码,然后按回车键。

现在您将进入一个文本编辑器(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 - daviesgeek
没有例外需要,那是一个了不起的答案,我非常高兴地感到惊讶,尤其是在我粗鲁地回复你之后。非常感谢你的帮助。 - Harry
3@daveisgeek - 你说得完全正确,但请注意我们是用sudo启动crontab。这意味着我们正在编辑root的crontab,因此其中的任何计划任务都将以该用户身份执行。 - macaco
嘿,我做了这个,到了约定的时间,弹出对话框说这台电脑将在10分钟后关机?并要求我取消。我不知道这是cron的结果还是我也做的省电功能的结果。cron会强制关机而无需取消对话框吗? - Harry
你不应该看到对话框。关闭节能选项中的计划表,这可能是显示该消息的原因。然后只需等待 cron 关机时间 :) - macaco
这是我的crontab的样子:http://cl.ly/363p2J3M3F2x0q042x1c 这是晚上10点30分吗?刚刚过去了,什么都没发生。 - Harry
3shutdown位于/sbin目录下,这个目录可能不在cron的默认$PATH中。要修复这个问题,再次执行sudo crontab -e命令,输入dd删除该行(假设文件看起来像你上面提供的链接),然后重新输入以下内容:30 22 * * * /sbin/shutdown -h now - nohillside
@patrix 太棒了,我忽略了/sbin/!现在可以运行啦 :) - macaco
1如何取消这个crontab? - Johnykutty
1如果你不想再做这件事,怎么才能逆转局面呢? - user3314418
@Johnykutty 和 @user3314418:编辑 cron 文件(sudo crontab -e),删除你添加的关机行,然后保存。 - Nathan Arthur
这个答案是否适用于机器处于休眠状态时? - Nathan Arthur
10年后... 这个答案不再有效!现在它会自动重新启动,而不是进行干净的关闭。 - Harry
@Harry,在这里,评论不是持久存在的,它们可能会消失。你的观察很有用。为了保留它,请在一个新的回答中发布不起作用的信息。 - DavidRecallsMonica
@Harry 有什么变化吗?假设你的硬件或操作系统自原始答案以来发生了变化,你能分享更多关于操作系统版本等的细节吗?(在我的 x86 MBP 上运行 macOS 12.3,这个方法仍然有效) - macaco

可以取消的:


停在 yymmddhhmm
shutdown -h 1109211555
四分钟后停止。
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/ 中的 launchd 代理时,它没有起作用,并且 'console' 会记录 'shutdown: NOT super-user'。也许在 /System/Library/LaunchAgents 中这样做会起作用(但是你不应该把东西放在那里 :-)) 我只需要一个正常的关机,所以我选择了 osascript,并将其放在 ~/Library/LaunchAgents/bla.shutdown.plist 中。运行得很好。 - commonpike
虽然我不得不使用<code>osascript -e 'tell app "Finder" to shut down'</code>。 - commonpike
这是唯一正确的答案。(在我看来) - CousinCocaine

这可以在“系统偏好设置” > “节能器” > “计划”中进行安排。我不确定这是否会启动强制关机,您需要试一下。但这是一个内置选项,用于自动化定时关机/开机。

  • 您也可以使用终端命令(需要管理员权限)强制关闭系统:

    shutdown -h now

    您可以将该命令放入launchdcron任务中进行定时执行。详细信息请参阅本文

  • 您还可以查看名为iWannaSleep的应用程序(不确定是否能强制关机)。


什么...??? 我在找一个应用程序。 - Harry
2你可能想表现得不那么不感激,但如果你重新阅读我的回答,你会发现我推荐了一个应用程序,而且如果你进行一些独立的研究,你会发现实际上还有几个其他具备这种功能的应用程序! - macaco
iWannaSleep 是人们在谷歌上推荐的第一个结果,可它并不能满足我的需求。你还建议我学习一些 Unix 的东西来关机? - Harry
不,我很感激你的帮助,只是你的帮助让我完全摸不着头脑。 - Harry
3我推荐它,因为这是一种使用内置工具实现你想要的目标的有效方式。如果你找不到适合你需求的应用程序,那么或许需要考虑我的建议方向。 - macaco
2能源节省 » 计划不是一个好的答案,因为它会在关机前10分钟提醒用户,并提供取消该过程的选项。 - TJ Luoma

你可以直接使用shutdown命令来安排将来的任何时间关机。
shutdown -h time
时间参数可以用以下两种格式指定一个未来的时间: +数字,或者是yymmddhhmm,其中年、月和日可以默认为系统当前值。第一种形式表示将系统关闭多少分钟,第二种形式表示在指定的绝对时间关闭。

更好的定时关机

如果您想要在预定时间安全地关闭您的Mac,考虑使用Power Manager;它可以在不让应用程序阻塞进程的情况下进行优雅的关机:

  • 所有活动用户都会得到充分的通知。
  • 在关机开始前会显示一个大的警告。
  • 正在运行的应用程序会被友好地要求退出。
  • 忽略友好请求的应用程序会被更坚决地强制退出。
  • 在最终关机之前,会等待注销完成。

对于恶意应用程序或进程来说,阻止这些步骤非常困难。

为什么不使用shutdown

使用shutdown将强制退出Mac上的所有进程,包括图形应用程序。对于许多应用程序来说,这是一种激进的行为,并且不给应用程序提供足够的机会保存状态或数据。

计划助手

Power Manager 包含一个 Schedule Assistant 任务,用于按计划 关闭电源

Power Manager - power off daily task

声明:我与制造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 将导致计算机每天在晚上11点(当地时间)关机。

如果您想更改时间,请在任何文本编辑器中编辑脚本。在此摘录的地方更改 Hour 和 Minute 键:

<dict>
    <key>Hour</key>
    <integer>23</integer>
    <key>Minute</key>
    <integer>0</integer>
</dict>
(请注意使用24小时制) (注意:这里只提供翻译文本)


你可以使用SendAppleEventToSystemProcess(kAEShutDown)来关机,然后使用命令killall -u username来关闭所有应用程序(因为您不希望它可取消)。或许您还想查看一下计时器类:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html - Samantha Catania
1很棒的文章,但OP在谈论使用cron或launchd时犹豫不决,我怀疑他并不打算自己编写解决这个问题的代码。 - macaco
1尽管这个理论上可能回答了问题,但最好还是在这里包含答案的关键部分,并提供链接作为参考。 - daviesgeek

  • 相关问题