+++++++++++++++++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