一般情況下,macOS在休眠時會自動斷開網絡,從系統的設計角度來說這還算是比較合理,只是蘋果的系統設計師大概不知道我們國內的網絡有多爛,下載幾個文件是不能按分鐘計的,常常就是個把小時甚至幾個小時,往往出現這種情況:當我喝完一杯咖啡過來看下載是否完成的時候,發現網絡早就斷了!
一般的解決方案是在【節能】中將【電腦進入睡眠】的滑動條拉到最右邊的【永不】位置就能防止系統休眠,自然也就阻止了斷網,但我感覺僅僅因為一個臨時需要就更改系統設置仿佛有點小題大作,而且對我來說,阻止休眠只有在進行下載的時候才有這個需要,平時我還是希望能用比較環保的方式使用電腦。一句話,我的希望就是某個應用運行的時候不斷網,其他的時候還是環保節能為好
一
當媒體播放器(如iTunes、mpv……)運行的時候,只要它在播放,就不會進入休眠,這個時候發生了什么呢?讓我們來看一下:
pmset
是系統自帶的電源管理設置程序,很明顯在運行播放器之前,sleep
是正常工作的,時間一到就睡你沒商量,當我把播放器打開,再次檢查系統的電源管理時,發現sleep
被阻止了——sleep prevented by coreaudiod
,原來機關在這里,只要我們能找到一個臨時阻止的方式,系統就不會休眠。
有這個方法嗎?當然有,還在10.4版本的時候,蘋果就帶了一個叫caffeinate
的系統工具,而且這個程序使用非常簡單,帶一個-w
的開關,并接上需要守護的進程ID,就會阻止系統休眠,直到這個進程退出為止。
二
到這里思路很清楚了,大概就是兩步:
- 獲得需要監控的進程的ID
- 用caffeinate來守護這個進程,只要這個進程不退出,系統就不會休眠
既然是兩步,那就寫一個腳本來操作好了,我將腳本文件命名為prevent_sleep
,放在/usr/local/bin
中,內容如下:
#!/bin/sh
if [[ -n "$1" ]]; then
pid=$(ps rax | awk '{print $1, $5}' | grep -i "$1" | cut -d ' ' -f 1)
if [[ -n $pid ]]; then
caffeinate -s -w "$pid" &
echo "Systemp sleep prevented by $1"
else
echo "Sorry, the $1 could not be found."
fi
else
echo "Please enter the name of the program that you want to wait."
echo "Example:"
echo " prevent_sleep wget"
fi
腳本首選檢查有沒有參數(需要監控的程序名稱),沒有的話就提示信息;有的話,就在當前系統中查找這個進程的PID,并將PID傳遞給caffeinate
,然后caffeinate
就在后臺默默運行,只要被監控的程序不退出,caffeinate
就不會退出。
三
最后,讓我們來看看有沒有效果:
如上圖所示,開始系統是正常模式(10分鐘之后休眠),然后執行prevent_sleep qq
,這個時候系統的電源模式就變成了sleep prevented by caffeinate
,只要QQ在運行,系統就不會進入休眠狀態,在任何時候,只要退出QQ程序,系統就會恢復正常模式。
好了,我該去喝一杯咖啡了……