文章定时自动采集(用Python编写数据采集脚本()上采集数据 )
优采云 发布时间: 2021-12-31 11:30文章定时自动采集(用Python编写数据采集脚本()上采集数据
)
概述:
在树莓派(xxxxx,以下简称工控机)采集数据上,传输到本地sqlserver数据库,用Python编写数据采集脚本。
这涉及到几个问题:当出现网络中断、断电、工控机重启等异常情况时,为了保证这些异常情况的发生,数据仍然可以自动采集,需要以下两种解决方案实施的。
开机自动启动;当脚本没有运行时,它会自动运行。
首选第二种方案,因为python程序崩溃或者网络异常导致程序中断,需要一种机制让它自动运行。
参考网址:
常用命令:
自动运行脚本:vim /etc/crontab
查看进程:ps -ef|grep tcpclient.py
自动运行脚本
启动TCP服务器监控功能:
输入vim /etc/crontab,最后输入* * * * * root python3 /home/pi/tcpclient.py
tcpclient.py 代码:
import socket
import time
import random
def main():
# 1 创建tcp套接字
while 1:
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 创建连接
tcp_socket.connect(('192.168.1.35', 6666))
# 3 发送数据
tcp_input = str(random.randint(2,15))
tcp_socket.send(tcp_input.encode('gbk')) # utf-8 中文会乱码
time.sleep(5)
# 4.关闭套接字
tcp_socket.close()
if __name__ == '__main__':
main()
输入ps -ef|grep tcpclient.py,可以看到进程多了(带问号的),tcpclient.py有while循环,不会自动退出,所以tcpclient.py每分钟自动运行一次。
优化
当然无线增加程序进程是不可能的,所以有两种选择:
每次执行tcpclient.py,都会自动关闭并终止程序,没有while循环。另外写一个test1.py程序,脚本会每分钟运行一次test1.py程序,test1.py判断tcpclient.py进程是否存在,如果存在不存在,它会运行;如果存在,它将不会运行。
这次采用了第二个选项,以避免每次tcp断开和重新连接(除非你像本例那样在while循环中关闭了socket)。
测试1.py 代码:
import time
import os
import re
# execute command, and return the infomation. 执行命令并返回命令输出信息
def execCmd(cmd):
r = os.popen(cmd)
text = r.read()
r.close()
return text
def doSomething():
os.system('python3 /home/pi/tcpclient.py')
time.sleep(10)
if __name__ == '__main__':
#ps -ef是linux查看进程信息指令,|是管道符号导向到grep去查找特定的进程,最后一个|是导向grep过滤掉grep进程:因为grep查看程序名也是进程,会混到查询信息里
programIsRunningCmd="ps -ef|grep tcpclient.py"
programIsRunningCmdAns = execCmd(programIsRunningCmd) #调用函数执行指令,并返回指令查询出的信息
print(programIsRunningCmdAns)
ansLine = programIsRunningCmdAns.split('\n') #将查出的信息用换行符‘\b’分开
print(len(ansLine))
#判断如果返回行数>3则说明python脚本程序已经在运行,打印提示信息结束程序,否则运行脚本代码doSomething()
if len(ansLine) > 3:
print("programName have been Running")
else:
doSomething()
结果
可以看出,test1.py和tcpclient.py进程在任何时候都是一样的,不会无限增加。工控机重启后,过程还是一样,说明已经达到了预期的效果。