article_image

稍微老道一些的 Windows 用户,遇上任何卡死的程序,都会自信地微微一笑,按下 CTRL-ALT-DEL 快捷键召唤出任务管理器1,将卡住的程序强制退出。这套可靠的退出机制,可算是给用户吃了一颗定心丸。

类似的退出方式在 macOS 常年缺席。尽管同样老道的 macOS 用户也可以微微一笑,打开活动监视器(Activity Monitor),但一方面这玩意儿没有快捷键(尽管你可以自己设置),另一方面,作为一个图形化的独立软件,系统卡死的时候能不能打开它都是一个问题。

好在 macOS 拥有一个不错的命令行环境和自动化生态,我们可以制作一个“进程管理器”,精确杀死或者批量退出任何卡死的应用。

Alt text
“进程管理器”

常规的退出方式

命令行和自动化终归是兜底方案,在 Dock 栏上看得见摸得着的、尚未彻底“卡死”的应用,通过 macOS 自带退出方式也可以治好。不过,强制退出到底算是“剖腹产”,多少有一些风险,在使用任何一种强推退出手段之前都建议检查一下文件保存设置,在“System-General”中确保没有勾选“Close windows when quitting an app”选项,以免强制退出后丢失文件修改记录。

Alt text
不要勾选“Close windows when quitting an app”选项

第一种常规强制退出方式可以在 Dock 栏中使用。所有在 Dock 栏中显示的应用(需正在运行,没有运行的自然没有退出一说),无论是原生还是第三方,都可以在按住 ‌⌥Option 的同时右键击之,即可看见“Force Quit”选项,点击后通常就能让应用完全退出。Finder 少有不同,不能完全退场,只能重启“Relaunch”。但凡一个应用还有 Dock 图标,这种方法一般还能奏效。

Alt text
按住 ⌥Option 键的同时右键强制退出应用

第二种常规退出手段同样面向当前 Dock 上运行中的应用。使用快捷键 ‌⌥Option-⌘Command-⎋Esc 或者在顶部菜单栏-苹果菜单中点击“Force Quit”,可以呼出一个类似 Windows 任务管理器的小窗口,其中呈现的就是 Dock 中的应用。在全屏工作时,使用 Dock 可能有些不便,也可以选择通过这一方法退出应用。

Alt text
通过 Force Quit 退出应用

以上两种方法都只能处理 Dock 中的应用,显然,相当一部分应用根本没有 Dock 图标,例如菜单栏管理器 Bartender、文件自动化整理工具 Hazel、键盘自动化工具 Keyboard Maestro……这些应用(通常是第三方应用)可以在活动监视(Activity Monitor)中控制。选中任意应用,再点击活动监视器顶部工具栏中的“✘”形状按钮即可将其退出。

Alt text
通过活动监视器退出应用

以上三种退出方式,基本能够满足“退出应用”这个需求,但和 Windows 上那种釜底抽薪的招式还是差了一口气。比如 Safari 和 Chrome 被标签页撑死的时候,可能连“右键点击”这一操作本身都会卡住;整个桌面都不幸黑屏的状况下,活动监视器也是泥菩萨过河,很难指望它去解救其他应用。

兜底的退出命令:killall

即便是不熟悉 macOS 下的命令行的读者,估计也在各种渠道——尤其是装神弄鬼的公众号——看到过下面这条命令:

killall Finder

这条命令简直是万金油,不仅电脑卡死时可以救急,对 Finder、Preview、LaunchPad 等等系统应用做过任何配置改动后,也几乎都可以像吃板蓝根一样,有备无患地来上一剂。仔细一想,输入这条命令时,电脑到底做了什么?

killall 是 Linux 系统中的一条命令,用于“杀死”进程(processes),在 macOS 的环境中,很多时候大约等同于退出一个应用。例如 killall Finder,语法上讲它“杀”了 Finder 进程,但我们感受到的实际效果就是强制退出并重启(relaunch)了 Finder。同样,这条命令也可以用于退出其他几乎任何应用,不管它正在运行、隐藏于 Dock 栏、位于菜单栏还是完全处于后台。比如一些窗口管理工具,卡住动弹不得时往往在强制退出界面也看不到其踪影,此时也可以用 killall 命令将其退出。

Alt text
在终端中输入命令强制退出 Finder

killall 毕竟更像古代流传下来的魔法咒语,你得先知道要退出的进程叫什么、正确拼出它的名字2,才能让咒语对其生效。从这个角度看,也难怪《真名实姓》将赛博世界描绘成了中土魔法世界。在 macOS 的自动化生态中,我们有远比古早命令行更方便的交互方式,可以做一个类似任务管理器的列表界面,更直观也更现代。

在很久很久以前的魔法时代,任何一位谨慎的巫师都把自己的真名实姓看作最值得珍视的密藏,同时也是对自己生命的最大威胁。因为——故事里都这么说——一旦巫师的对头掌握他的真名实姓,随便用哪种尽人皆知的普通魔法都能杀死他……

知道一个进程的名字,就可以用 killall 杀死它。我仿照任务管理器和 Force Quit 的界面,制作了一个当前进程列表——“进程管理器”,可以强制退出其中任意进程。和在 Finder 中选取文件类似,你可以在“进程管理器”中按住 ‌⌘Command 键选中多个进程,将其批量退出;此外,习惯全键盘操作的高手也可以通过按键快速定位任意进程,例如按下 do 一般就能找到“Dock”(只要没有其他和它名字前两个字母相同的进程),按下 air 则是“Airdrop”。

Alt text
可以批量退出进程的“进程管理器”

这个“进程管理器”由 AppleScript 编写而成,其退出功能则由于 killall 完成。你可以把它嵌入任何支持 AppleScript 的自动化工具,除了文章开头提供的 Automator,还包括 Keyboard Maestro、LaunchBar、Alfred 等选择。如果想和系统功能保持整齐,可以仿照 Force Quit 的启动方式,设置 ‌⌃Control-⌥Option-⌘Command-⎋Esc 为“进程管理器”的快捷键。

“进程管理器”会列出所有当前进程,而不仅仅是单个应用,如果不熟悉某些名称所指代的对象,最好不要随意将其退出。虽说一般情况下将应用和进程混为一谈也无妨,但有时候也需要区分“进程”和“应用”,举一个简单的例子,几乎所有的自动化工具都有编辑界面和运行界面,比如 Keyboard Maestro、Hazel 和 Automator,每个应用往往拥有两个以上的进程,有的可能还独立于主应用之外(比如 Hazel 的帮手程序 HazelHelpr),这时候囫囵吞枣使用 killall 可能就会错杀。

一般而言,我会用“进程管理器”结束并重启一些系统进程,比如 Dock、QuickLook、AirDrop 和 bird3,这几条进程卡顿或工作异常时可以试着杀掉并重启,往往能获得“重启解决一切”的效果。另外,自动化工具——尤其是其中的子进程——卡死后往往无法通过正常方式退出,也很难在 Force Quit 列表中找到它们,此时同样可以通过“进程管理器”将其退出。

小结

退出应用,本身是一件不大不小的事,macOS 提供的一些原生方法也能够满足多数需求。但和 Windows 用户之间,似乎总差了一点信心。即便是活动监视器,至少在感官上仍然是“另一个应用”,有种找隔壁班同学来助阵的感觉,底气没那么足——它本身也会卡死啊;而 Windows 的任务管理器和锁屏、切换用户、注销、更换密码等功能并列,让人心里有底——事实上它也确实比 macOS 的同类功能更强,不仅应用和进程,甚至可以退出用户(Users)。

至少在退出应用和进程方面,我们希望有一款类似 Windows 任务管理器这样的兜底工具,既不用和卡死的应用纠缠不清,也无需不分青红皂白关机重启。对电脑有了更多的掌控,就能带给使用者更多的自信。


  1. 另一种组合是 ‌CTRL-SHIFT-ESC
  2. 另一个方式是根据 ID 退出进程,那更加复杂。
  3. bird 是 iCloud 的一个进程,如果 iCloud 忽然抽搐,把 bird 宰掉几乎能包治百病。

author_avatar

Lawyer, macOS/iOS Automation Amateur