zoukankan      html  css  js  c++  java
  • 树莓派定时关机

    +++++++++++++++++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
  • 相关阅读:
    .NET简谈设计模式之(适配器模式)
    .NET简谈组件程序设计之(手动同步)
    .NET简谈组件程序设计之(初识远程调用)
    .NET简谈组件程序设计之(初识.NET线程Thread)
    .NET映射设计(Model与UIControl之间的模型关系)
    .NET简谈事务本质论
    .NET简谈组件程序设计之(异步委托)
    向5.4致敬吧 无为而为
    SQL 2005 分析服务基于角色的动态授权 无为而为
    文思创新深圳招聘biztalk 无为而为
  • 原文地址:https://www.cnblogs.com/WeiG/p/9856603.html
Copyright © 2011-2022 走看看