背景介紹

我有一個(gè)習(xí)慣,定鬧鐘每隔60分鐘左右,提醒自己休息一次。我發(fā)現(xiàn)自己有時(shí)候長(zhǎng)時(shí)間思考,很容易拘泥于細(xì)節(jié)之中。適當(dāng)?shù)暮?jiǎn)單休息過(guò)后,往往會(huì)對(duì)正在解決和處理的問(wèn)題有新的認(rèn)識(shí)和發(fā)現(xiàn),有事半功倍的奇效。
不過(guò)大部分手機(jī)鬧鐘都不支持這種以小時(shí)為單位的周期鬧鈴。所以,我以前每次都是都手動(dòng)調(diào)整鬧鐘時(shí)間??偢杏X(jué)有點(diǎn) Low!于是,我就寫(xiě)了個(gè)簡(jiǎn)單的發(fā)郵件的 Lua 腳本,放到樹(shù)莓派上作為一個(gè)shell命令使用;然后在每周一到周五的9點(diǎn)至23點(diǎn)整點(diǎn)各執(zhí)行一次發(fā)郵件的操作。郵件是發(fā)到了我的 QQ 郵箱。收到QQ郵件后,左上角會(huì)有一個(gè)通知懸浮窗,體驗(yàn)比手機(jī)的震動(dòng)聲好了很多。
另外,之所以會(huì)選擇使用 Lua 語(yǔ)言,只是最近自己剛好在看 Lua 而已,用其他語(yǔ)言也是可以的。
在樹(shù)莓派上配置必要的 Lua 環(huán)境
安裝 LuaJIT
樹(shù)莓派的 debian 官方推薦定制系統(tǒng),內(nèi)置有 Lua 5.1.5.但是 LuaJIT 使用了 JIT 技術(shù),執(zhí)行效率更高,所以更推薦安裝和使用。LuaJIT 對(duì)應(yīng)的也是 Lua 5.1 的語(yǔ)法。
你可以在 LuaJIT 下載頁(yè) 右鍵查看最新的 LuaJIT 穩(wěn)定版本,然后參照?qǐng)?zhí)行:
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar xzf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make && sudo make install
驗(yàn)證是否安裝成功,請(qǐng)執(zhí)行:
luajit -v
安裝成功,會(huì)輸出:
LuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
安裝 luarocks
luarocks 是 Lua 的包管理工具。在樹(shù)莓派上需要從源碼安裝 luarocks 。這需要一些技巧。
你可以到 luarocks下載頁(yè) 查看最新的luarocks版本,然后參考執(zhí)行以下命令:
wget http://luarocks.github.io/luarocks/releases/luarocks-2.4.3.tar.gz
tar xzf luarocks-2.4.3.tar.gz
cd luarocks-2.4.3
luarocks 在編譯前,需要先進(jìn)行配置。完整的配置內(nèi)容,參見(jiàn):Customizing your settings。基于 LuaJIT 的配置命令如下:
./configure --lua-suffix="jit"
然后編譯安裝:
make build
sudo make install
驗(yàn)證是否安裝成功:
luarocks
安裝 luasocket
luasocket 這個(gè)庫(kù),下面的代碼會(huì)用到,需要提前安裝下。 如果 luarocks 安裝成功,那其他的 lua 庫(kù)安裝就非常簡(jiǎn)單了:
sudo luarocks install luasocket
簡(jiǎn)單的 Lua 腳本: 發(fā)送郵件提示自己注意休息
新建一個(gè) rest_reminder.lua 文件
vi rest_reminder.lua
然后輸入以下 Lua 代碼:
#!/usr/bin/env luajit
local smtp = require("socket.smtp")
from = "username@exapmle.com" --發(fā)件人
--收件人列表
rcpt = {
"your_qq_number@qq.com"
}
mesgt = {
headers = { -- 只是文字顯示內(nèi)容.
to = "your_qq_number@qq.com", --收件人
subject = "請(qǐng)休息五分鐘!" --主題
},
body = "您已連續(xù)思考一小時(shí),請(qǐng)先休息五分鐘吧!"
}
r, e = smtp.send{
from = from,
rcpt = rcpt,
source = smtp.message(mesgt),
server = "smtp.example.com",
user = "username@exapmle.com",
password = "username_pwd"
}
if not r then
print(e)
else
print("發(fā)送成功!")
end
如果你想實(shí)現(xiàn)一些更復(fù)雜的操作,最好在常用電腦上配置一個(gè) Lua 完整的開(kāi)發(fā)環(huán)境。
想要文件能執(zhí)行當(dāng)做命令執(zhí)行,還需要給文件添加可執(zhí)行權(quán)限:
chmod +x ./rest_reminder.lua
測(cè)試代碼是否有效:
./rest_reminder.lua
正常執(zhí)行的話(huà),你的收件人郵箱(或郵件垃圾箱),應(yīng)該會(huì)收到一封郵箱。

注意:
- headers 中的收件人會(huì)顯示在郵件頭,但是真正決定發(fā)送給誰(shuí)的是 rcpt
- smtp.example.com 要改為發(fā)信郵箱的 smtp 服務(wù)器。
- username@exapmle.com 和 username_pwd 要改為真實(shí)的郵件用戶(hù)名和密碼
- 部分郵箱的 smtp 功能,可能需要單獨(dú)開(kāi)通。
使用 crontab 來(lái)定時(shí)執(zhí)行
crontab 簡(jiǎn)單實(shí)用,如果不是很熟悉,可以把它簡(jiǎn)單當(dāng)做一個(gè)高度自定義的定時(shí)器。
假設(shè)腳本的完整路徑是 /home/pi/task/rest_reminder.lua 。
執(zhí)行:
crontab -e
在打開(kāi)的內(nèi)容區(qū)末尾新增:
00 9-23 * * * /home/pi/task/rest_reminder.lua
保存退出,正常應(yīng)該會(huì)看到提示:
crontab: installing new crontab
此時(shí),我們的定時(shí)腳本已經(jīng)生效了。即使重啟電腦,這個(gè)腳本依然可以正常定時(shí)執(zhí)行。
crontab 借助于 cron 服務(wù)。在必要時(shí),你可以使用 sytemed 的命令來(lái)操作 cron 服務(wù):
# 查看狀態(tài)
sudo systemctl status cron
# 激活服務(wù)
sudo systemctl enable cron