shell和python监视小孩看电视时间并发邮件
最近带娃发现小孩看电视真是目不转睛、一动不动,于是有个想法。在上班时,如果小孩长时间看电视怎么来提醒我呢?
现在的电视基本都是智能电视,都有IP地址。如果你的路由器可以看到IP在线的话,就判断为在看电视。那隔一段时间就拿出手机看看在不在线?那就太费人了!想起以前做过的ping IP地址以及发邮件的测试案例,于是乎,笔者就在长时间开机的树莓派上部署使用shell和python脚本,来完成监视小孩看电视时间并发邮件。代码修改后完全可以用来监控服务器。
先来说一下,为啥要再用python再来写一遍。因为笔者在ubuntu上安装bsd-mailx时选择错了local site,再重装时居然没有让我选择,一时居然用不了mail。其实在安装软件或者工具时,也可以遇到包依赖问题,除了解决包依赖问题外,还可以在ubuntu中可以使用snap命令(需要有这个软件)像容器一样安装,也可以在github上(需要有这个软件)直接下载二进制文件。如果搞不定,那么直接python脚本来实现。
下面就是在centos下用shell脚本,ubuntu下使用python脚本。脚本中将看电视开始时间和看电视结束时间写入日志文件,是为了后期的完善修改。试想在多次提醒小朋友后,可能她已经知道一个小时的规律了,会在一个小时前开关然后再打开电视,那么根据日志分析的话,任何的小聪明读逃不过。当然,不能让小孩知道树莓派,直接把源头给关了。
1、centos下的shell脚本
脚本的就是使用net=$(ping $tv_ip -c 1 -w 1 | grep "received" | awk '{print $4}')来读取一次ping、延时1秒的包的返回数量,根据net返回值来进行判断。
脚本的核心就是标记位is_on_watching,根据两次标记位的值来判断是在看电视还是关电视。on_time是在看电视的循环过程中的时间,on_time和start_time差值超过一小时3600s,即判断看电视超过1小时,然后使用mail发送邮件通知。关于mail的配置方面,请参考笔者的文章-Linux中通过SHELL发送邮件 。
脚本有个小问题,在关机后再开机时,on_time还时以前的值,on_time和start_time差值会是负值,但是不影响大小判断。
代码托管在shells/ping_and_mail.sh at main · laufei90/shells (github.com) 。
2、ubuntu下的python脚本
python脚本和上面的shell脚本的逻辑类似,真是平台的函数不一样而已。笔者使用了两个方法来完成,一个是自定义日志文件,通过with上下文管理器来将日志写入文件中,但是日志是以日期为文件名来保存的,后期需要自己通过crontab定时任务来清理。二个更加pythonic,使用logging模块的配置文件来自动完成日志的动态管理,具体可以参考笔者的文章—Python使用logging模块完成日志记录 。
自定义日志文件的代码托管在python/ping_and_mail.py at main · laufei90/python (github.com) 。
使用logging日志文件的代码托管在python/ping_and_mail_use_logging.py at main · laufei90/python (github.com) .