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
  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/WeiG/p/9856603.html
Copyright © 2011-2022 走看看