构思一个掉电自动关闭程序的功能

in #cn5 years ago

某程序异常关闭后会导致数据异常,重新更新数据需要大量的时间,所以保证不间断的电源供应非常必要。


(图源 :pexels.com)

在机房环境中一般会有冗余的电源供应,一般来讲几乎不用担心掉电问题,可是如果放到家里的电脑上允许,使用市电网络,那么电源问题就是要考虑的问题了。

一般来讲,最简单的方式是使用UPS,这样可以应对大部分突发断电故障,留给我们足够的时间来正常关闭电脑。

但是如果恰巧我们停电时不在家并且停电持续的时间比较长,那么UPS电源耗尽存储电量的后果也是电脑关机。

那么有没有办法在停电时自动关闭程序呢?亦即让程序正常退出,这样来电时我们就可以重新启动程序了。

硬件构思

我想到的一个可行貌似可行的办法就是使用一个Arduino 去检测市电,电脑通过串口连接Arduino并定期(比如2分钟一次)检测市电掉电事件,如果发生市电停电,则给程序发送关闭信号(SIGINT)。

这样做的前提之一是市电断掉后,我们的电脑还可以工作一小段时间(比如十分钟或者半个小时),这样一则让Arduino可以工作,二则市电断掉后,要有足够的时间来处理SIGINT信号等,所以UPS还是必须品。

至于Arduino检测市电断电事件就应该很简单了,在市电上插一个USB充电器(就用普通的USB2.0 Type A接口的充电器就好),这样的充电器输出电压是5V。


(图源: https://en.wikipedia.org/wiki/USB_hardware#Connectors)

Arduino与电脑USB连接,将Arduino与USB充电器共地,然后任意模拟口连接USB的正5V就行,当然为了Arduino的安全可以考虑在USB+5V和模拟口之间串联个220欧姆的电阻,这样一个简易的电压测量装置的硬件就搞定了。

Arduino 程序

至于代码就更简单喽,用官方的AnalogReadSerial示例就可以啦。

当然了,我们可以再加一些调整,比如修改读取间隔,或者加上断电报警等功能。

电脑程序

对于电脑端而言,我们需要一个读写串口并根据情况给其它程序发送信号的程序。

理论上无论用C还是用Python都可以实现,Python读写串口可以用pySerial,Github地址和参考文档如下:

https://github.com/pyserial/pyserial
https://pythonhosted.org/pyserial/index.html

看起来应该很简单。

发送信号,理论上可以用os.kill功能,据说Windows下可能没法用,但是我计划用Linux,应该问题不大。

嗯,暂时就想到这吧,至于什么时间弄出来,就不好说啦,毕竟一直以来我都是空想家,不是实干家。😀

相关链接


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

Sort:  

!thumbup
恭喜你!您的这篇文章入选 @justyy 今日 (2019-10-22) 榜单 【优秀的文章】, 回复本条评论24小时内领赏,点赞本评论将支持 @dailychina 并增加将来您的奖赏。
@justyy 是CN区的见证人,请支持他,给他投票,或者设置justyy为见证人代理。感谢!@justyy的主要贡献:https://steemyy.com

Congratulations! This post has been selected by @justyy as today's (2019-10-22) 【Good Posts】, Steem On! Reply to this message in 24 hours to get rewards. Upvote this comment to support the @dailychina and increase your future rewards! ^_^

SteemIt 工具、API接口、机器人和教程
SteemIt Tools, Bots, APIs and Tutorial



If you believe what I am doing, please consider a spare vote voting me here, thank you very much indeed.

@justyy - the author of https://SteemYY.com and I have been a Steem Witness for more than a year now.

Thank you so much for participating in the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.22% upvote! Together, let’s change the world!

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.029
BTC 56087.39
ETH 2965.10
USDT 1.00
SBD 2.15