+++++++++++++++++18.5.19
背景:樹莓派3b+debian+crontab
樹莓派作為web服務器放在學校的宿舍,學校宿舍每天晚上23點左右停電,樹莓派沒有電池,斷電相當於直接拔掉電源管理,容易損壞文件系統導致系統無法啟動起來等問題。
目標:讓樹莓派定時安全的自動關機。
正文:
樹莓派安裝的系統屬於linux操作系統,linux自帶的定時任務管理服務(cron)可以幫助我達成目標。
定時任務有兩種級別,
一種是系統級別的,通過修改 /etc/crontab 文件來設置定時任務。
另一種是用戶級別的,通過命令 crontab -e 來設置定時任務。
我通過系統級別的定時任務達成目標
在crontab 文檔加入
53 22 * * * root /sbin/init 0
保存並關閉。
就設定完成了。
操作很簡單,但是有不少注意事項。
- crontan文檔中加入的條目不能出現中文,即使是中文空格也不可以。必須使用英文。
- 命令的路徑盡量寫全,否則系統可能找不到命令,定時任務就失敗了。
- cron服務不能處於關閉狀態,否則定時任務會失效。
- cron服務每分鍾都會掃描一次crontab文檔,所以只需要正確寫入條目,保存並關閉,不必要重啟服務,或者重新讀取配置文檔。當然你並不是不可以重啟服務。
- crontan文檔中加入的條目語法不能錯誤,否則定時任務會失敗。
- 系統時間要與樹莓派所在時區一致。因為是定時任務,如果時間不統一,那么定時也就沒有意義了,甚至會導致任務失敗。
任務延伸:
正文部分的方法可以實現自動關機的目標。
而我希望樹莓派能在自動關機的時候記錄日志,這樣就可以清楚的知道樹莓派是什么時候關機的,關機任務有沒有完成。
所以我着手改進了自動關機方案。
- 寫一個bash腳本,包含記錄日志以及關機指令。
- 使用cron定時任務定時啟動這個bash腳本,就可以實現記錄日志的定時關機目標。
---------------------------18.5.19
++++++++++++++++18.5.22
補充上傳腳本
這兩個腳本一個是bash腳本用來關機記錄日志,
另一個是python腳本用來發送郵件
所以現在的結構是cron服務定時運行關機腳本,關機腳本啟動發郵件腳本,發送完郵件就關機。
郵件發向qq郵箱,因qq與微信關聯,可以設置微信郵件提醒。
現在樹莓派自動關機,我的微信就可以收到關機提醒。
#!/bin/bash /usr/bin/python /x-py/QQmail-init0.py #用來啟動郵件發送腳本 echo "power-down" >> /home/power-down-date.txt #寫入 date >> /home/power-down-date.txt echo "++++++++++++++++" >> /home/power-down-date.txt /sbin/init 0 #關機命令
#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='xx@qq.com' # 發件人郵箱賬號 my_pass = ' ' # 發件人郵箱密碼 (實際上是授權碼) my_user='xx@qq.com' # 收件人郵箱賬號,我這邊發送給自己 def mail(): ret=True try: msg=MIMEText('樹莓派定時關機腳本已運行','plain','utf-8') msg['From']=formataddr(["From_x",my_sender]) # 括號里的對應發件人郵箱昵稱、發件人郵箱賬號 msg['To']=formataddr(["MY",my_user]) # 括號里的對應收件人郵箱昵稱、收件人郵箱賬號 msg['Subject']="樹莓派3B定時關機提醒" # 郵件的主題,也可以說是標題 server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 發件人郵箱中的SMTP服務器,qqamtp端口是465 server.login(my_sender, my_pass) # 括號中對應的是發件人郵箱賬號、郵箱密碼 server.sendmail(my_sender,[my_user,],msg.as_string()) # 括號中對應的是發件人郵箱賬號、收件人郵箱賬號、發送郵件 server.quit() # 關閉連接 except Exception: # 如果 try 中的語句沒有執行,則會執行下面的 ret=False ret=False return ret ret=mail() if ret: print("郵件發送成功") else: print("郵件發送失敗")
參考資料與實踐經驗:
零,crontab定時任務不執行的原因(以及cron使用)
一,cron定時任務的應用
二,超鏈接
/etc/crontab文件和crontab -e命令區別
1、格式不同
前者
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
后者
#50 1 * * * command
2、使用范圍
修改/etc/crontab這種方法只有root用戶能用,這種方法更加方便與直接直接給其他用戶設置計划任務,而且還可以指定執行shell等等,crontab -e這種所有用戶都可以使用,普通用戶也只能為自己設置計划任務。然后自動寫入/var/spool/cron/usename
1、crontab會進行語法檢查,vi不會
2、有些os的crond不會重讀配置,所以用service重啟
crontab -e是某個用戶的周期計划任務;/etc/crontab是系統的周期任務
crontab -e與/etc/crontab修改語法格式不一樣,后者多一個user指定
不管用crontab -e或者/etc/crontab都不需要重新啟動crond服務
,
三, 樹莓派時間同步
---------------------18.5.22
