目前来说,造成关机慢的主要原因可以分为OS X系统本身问题和应用软件问题。这两个的本质区别在于,前者造成系统退出后屏幕出现“旋转齿轮”(Spinning Gear,俗称无限菊花,甚至有人数圈数,称之20圈菊花等等)并等待很长时间,而后者是在系统退出之前,系统尝试退出所有当前运行中的程序的过程,说得更具体点就是,launchd本身退出之时(系统问题)或之前(应用软件问题)。应用软件问题我们这里无法给出任何的答案,Apple也无能为力。我们主要是讨论系统问题。
在後面我們給出一個靠譜的解決方案之前,我們來看看對一個系統問題應該如何入手。當我們去分析大家解決問題的思路的時候可以發現,有這樣幾個大致思路,有的從硬件入手,比如重置PRAM和SMC,內存等方法;有的是根據以往的解決大多數問題的思路開始著手,比如建議修複權限、禁止啓動項等就是這個思路;有的是碰機會,比如關Wifi等。其實,他們都有可能,但是都沒有抓住一個基本有效的方法。對于Troubleshooting的手段來說,幾乎所有有經驗的程序開發人員/系統管理人員等都會想到,系統日志logs,檢查系統日志是排除故障的一大利器,尤其是系統級別的。其實早有網友就注意從這方面著手,可惜有點偏了沒有找到重點。
1、要抓住重点,还要从系统的内部管理来说。OS X系统启动的基本步骤是这样的:
- 通电,Boot-ROM进行初始化。
- Boot-ROM后处理,此时是黑屏,电源LED灯亮,如果出现任何错误,LED灯会有规律闪动。
- 开始调用EFI:会听到咚的那一个长音。
- EFI启动:会响应用户键盘,比如进入单用户模式等按键。正常情况下,读取boot.efi正常后,出现银色的Apple标识。
- 启动内核:看到灰色背景和旋转齿轮。从这里开始,就可以从Activity Monitor程序中找到各个进程的关系了。
- 启动launchd:此时看到蓝屏。launchd负责启动和管理系统的各个服务
- login窗口出现:
- 用户登录:用户登录后,系统也是使用另外一个launchd来为该用户开启用户环境的,之后,用户的所有动作(除非特殊情况),都在这第二个launchd的管理之下。
2、现在让我们开启在/Applications/Utilities目录中的Activity Monitor程序,选择All Process, Hierarchically, 如下图,就可以看到各个进程之间的关系。核心总是占用任务ID 0的,而第一个launchd总是ID 1,用户launchd(下图中的ID 154)是ID 1的进程子进程。
3、既然启动是这个过程,那么退出/关机就是一个反过程。先关闭用户环境,就是用户launchd的退出过程;之后是系统退出过程,也就是ID 1的launchd的退出过程。所以,系统关闭慢的原因,应该是ID 1的launchd在关闭各个由他负责关闭的某个/某些服务的退出延迟造成的。当我们了解了这些之后,就可以着手分析了。
如何找到哪个服务进程退出延迟了呢?这就要看日志了,打开Console程序,在左边找到/var/log >> com.apple.launchd >> launchd-shutdown.system.log,之后,在右上角的查找中,输入timeout,就会出现如下图的画面,改图这是我修改之后的截图,在修改之前,两个服务的timeout时间, applevents是20 seconds, securityd是15秒。
4、這就找到了系統關閉奇慢的真正原因了,launchd給各個服務發出SIGKILL信號後,等待所有服務都退出後,才能退出,而由于一些服務退出超時,就造成整個系統關閉放慢。至于,這些服務爲什麽/什麽情況下出現退出異常超時以及如何徹底解決之,我們只有讓Apple的系統開發人員處理了,我們無從修複,不過我們可以通過給他設定退出超時時長來改變一下它的行爲,這就需要一點對plist文件的知識了,具體的系統(launchd)如何定義和解讀plist文件,我們不進行深入探討,只給出方法,有興趣的可以去developer.apple.com去讀相關的文檔。
綜上所述,目前來說,比較靠譜的思路就是,給每個造成退出超時的系統服務設定一個比較短的退出超時時間(1或2秒)。
根據上面找到的兩個服務來說,一個是com.apple.securityd,一個是com.apple.coreservices.appleevents。我們使用下面的命令來對他們進行處理。
sudo defaults write /System/Library/LaunchDaemons/com.apple.securityd ExitTimeOut -int 2
sudo defaults write /System/Library/LaunchDaemons/com.apple.coreservices.appleevents ExitTimeOut -int 1
6、如果系統詢問,請輸入當前管理員密碼,以完成該命令。
之後,重新啓動系統後,再次關機的時候,就可以實現"秒關",而看不到旋轉菊花了。當然,每個系統的情況不一樣,造成緩慢的原因會不同,所以,每個人需要針對自己機器的情況來具體處理。如果需要幫助,可以留言,並把上面Console中timeout的情況說明,我可以爲大家具體寫出命令。
免責聲明:文中圖文均來自網絡,如有侵權請聯系刪除。
歐普軟件發布此文僅爲傳遞信息,不代表歐普軟件認同其觀點或證實其描述。