樹莓派定時關機


+++++++++++++++++18.5.19
背景:樹莓派3b+debian+crontab
樹莓派作為web服務器放在學校的宿舍,學校宿舍每天晚上23點左右停電,樹莓派沒有電池,斷電相當於直接拔掉電源管理,容易損壞文件系統導致系統無法啟動起來等問題。
目標:讓樹莓派定時安全的自動關機。
正文:
樹莓派安裝的系統屬於linux操作系統,linux自帶的定時任務管理服務(cron)可以幫助我達成目標。
定時任務有兩種級別,
一種是系統級別的,通過修改 /etc/crontab 文件來設置定時任務。
另一種是用戶級別的,通過命令 crontab -e 來設置定時任務。
 
我通過系統級別的定時任務達成目標
在crontab 文檔加入
53 22 * * * root /sbin/init 0
保存並關閉。
就設定完成了。
操作很簡單,但是有不少注意事項。
  1. crontan文檔中加入的條目不能出現中文,即使是中文空格也不可以。必須使用英文。
  2. 命令的路徑盡量寫全,否則系統可能找不到命令,定時任務就失敗了。
  3. cron服務不能處於關閉狀態,否則定時任務會失效。
  4. cron服務每分鍾都會掃描一次crontab文檔,所以只需要正確寫入條目,保存並關閉,不必要重啟服務,或者重新讀取配置文檔。當然你並不是不可以重啟服務。
  5. crontan文檔中加入的條目語法不能錯誤,否則定時任務會失敗。
  6. 系統時間要與樹莓派所在時區一致。因為是定時任務,如果時間不統一,那么定時也就沒有意義了,甚至會導致任務失敗。
 
任務延伸:
正文部分的方法可以實現自動關機的目標。
而我希望樹莓派能在自動關機的時候記錄日志,這樣就可以清楚的知道樹莓派是什么時候關機的,關機任務有沒有完成。
所以我着手改進了自動關機方案。
  1. 寫一個bash腳本,包含記錄日志以及關機指令。
  2. 使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM