首先聲明一下:該點子非本人原創,我只是用它在Mac OS X上給出了實現。html
須要三個文件,被髮布在本人的GitHub上,有須要或想了解的請自行參考。python
簡單介紹下三個文件分別的做用:git
pcMonitor.py--Python程序文件,用於實現開機監控以及強制關機的處理邏輯github
com.yanghua.pcMonitorService.plist--Apple Mac OS X對於想要開機啓動程序的描述文件。(在windows 上可能稱之爲開機啓動計劃)shell
pcMonitorService.sh--在com.yanghua.pcMonitorService.plist中描述的,須要被直接執行的程序。(系統開機自執行程序不支持直接執行Python腳本,因此經過執行執行該sh腳本,在該sh腳本中間接執行pcMonitor.py腳本)。windows
(1)開機未登陸 郵件自動提醒微信
(2)開機登錄後 郵件自動提醒工具
(3)回覆提醒郵件以「shutdown」,則被開啓的Mac 機器會被強制關閉ui
不管是否鏈接互聯網:spa
(4)支持開機後,以必定的頻率定時截取當前屏幕做爲圖像日誌
備註:這些功能對於我的電腦常被借用、公用來講很是有用,便於我的對本身電腦的使用有即時瞭解。
其實很簡單,想要在手機和電腦之間產生交互,須要兩個條件:
(1)鏈接 這個只能依賴於互聯網了
(2)通訊 通訊離不開協議,這裏選擇的話,雙方均可識別的,而且操做簡便的,沒有比經過郵件來實現更好的選擇了。
上面提到了,com.yanghua.pcMonitorService.plist該文件用於使得該監控程序開機自動啓動,它會間接執行pcMonitor.py腳本。該腳本被執行以後,將開啓一個輪詢程序。若是碰巧,它開完機就自動鏈接上了互聯網,那麼它將直接給你預留的郵箱中發送郵件,若是沒有,在你發送郵件就會產生程序異常,此處異常被直接吞噬,只返回Boolean標示,休眠一段時間,繼續發送,直到機器聯網發送成功爲止。爲了達到即時的目的,你可能須要藉助手機的某些工具(好比在手機的微信中開啓QQ郵箱提醒功能,若是你沒有QQ郵箱,那麼其它郵件提供商不少也跟運營商進行了合做支持了郵箱與手機號碼的綁定,這樣在收到郵件的時候就能夠支持短信提醒)。
至此發送結束,那麼下面會進入接收郵件的偵聽模式。當接收到標題爲郵件提醒時發送的郵件標題(由於關機指令只需回覆提醒郵件),而且郵件內容包含shutdown關鍵字的時候。將會執行關機命令:
關鍵代碼:
[python] view plain copy print?
if __name__ == '__main__':
init()
MAIL_TXT = "the computer has started %s" % time.strftime(' at %c')
while True:
if send_mail(MAIL_TITLE, MAIL_TXT):
break
else:
time.sleep(60)
while True:
shutdown=receive_mail()
if shutdown:
shutdown_cmd ="shutdown -h now"
print(shutdown_cmd)
process=subprocess.Popen(shutdown_cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE)
process.wait()
else:
print("sleep")
time.sleep(60) #sleep 60s
首先,須要編寫開機啓動程序的描述文件。
文件須要放到/Library/下(經過快捷鍵:shift+Command+G):
進入後,有兩個相關的文件夾:
主要相關的文件夾就是這兩個,但有什麼區別呢?
LaunchAgents--存放在開機並登錄以後纔會執行的計劃任務
LaunchDaemons--存放在開機以後就會執行的計劃任務
注:這兩個文件夾的區別,也是我上面「實現功能」中的(1)、(2)兩點的關鍵點,這就是取決於你將那個任務描述文件放在哪一個文件夾內。
你能夠直接將com.yanghua.xxx.plist文件直接拖放至兩個文件夾的其中之一。由於該文件夾實際上是系統相關的文件,因此須要授予其權限,因此在你拖放過程當中可能須要輸入密碼。
或者,經過在Terminal中,經過cp命令來拷貝文件:
上面同時把其餘的兩個文件放到/usr/local/文件夾下,他們一樣是系統相關文件,須要你在命令前加上「sudo」,同時有可能會要求鍵入password。
在操做某些系統級別相關的文件夾中的文件時,非超級管理員用戶(root用戶)可能沒有執行權限,而在咱們的程序裏,咱們程序的執行者其實就是當前登錄用戶(由於它在用戶登錄成功後,以其身份執行),而它確定不是超級管理員。因此,必須爲pcMonitorService.sh文件授予「其餘用戶可執行的權限」:
至此,大部分任務都完成了,還有一個很是關鍵的問題。回覆的郵件:shutdown,其實只是一個給監控程序執行關機指令的「關鍵字」,它在程序裏,卻會真正執行shutdown的shell命令。衆所周知,shutdown默認狀況下只能夠被root用戶執行,其餘用戶是沒有權限執行shutdown命令的。
因此須要兩個步驟來給予其餘用戶以shutdown命令的執行權限:
(1)修改sudoers文件,執行命令sudo visudo
進入以後,按「i」進入編輯狀態,修改最後一行:
爲:
去掉最前面的#號,將users修改成你想執行監控腳本的用戶名,好比:yanghua
而後爲shutdown設置suid:
以上設置完成以後,基本上大功告成了!
關於代碼,你還須要做一些修改,主要是關於pcMonitor中的,由於必需要你本身提供關於郵件地址相關的內容:
[python] view plain copy print?
#TODO: change the e-mail address which you want to comunicate with monitor
MAIL_LIST = ["XXXXXX@qq.com"]
#TODO: change the smtp/pop3 server which will serve for the monitor
MAIL_HOST = "smtp.exmail.qq.com"
MAIL_POP = "pop.exmail.qq.com"
#TODO: change the email-addr and pwd which the monitor will use
MAIL_USER = "xxxx@qq.com"
MAIL_PASS = "xxxxxxxxxx"
MAIL_FROM = "xxxx@qq.com"