问题描述
我正在尝试创建一个Python脚本,该脚本需要在多个实例中在后台连续不断地并行运行。
我尝试在ubuntu 20.04中使用crontab并具有以下内容
* * * * * python3 ~/Documents/xxx/pollingservice.py -d 185 > /tmp/log 2>&1
1 * * * * python3 ~/Documents/xxx/pollingservice.py -d 186 > ~/Documents/logs 2>&1
1 * * * * python3 ~/Documents/xxx/pollingservice.py -d 186 > ~/Documents/logs-186 2>&1
1 * * * * python3 ~/Documents/xxx/pollingservice.py -d 187 > ~/Documents/logs-187 2>&1
基本上,我想运行带有多个参数的单个脚本。他们正在做的是使用Modbus协议从设备中获取数据并将其保存在csv文件中。但是,似乎 cronjob没有运行,在使用命令service cron start
以下是python脚本
from pymodbus.client.sync import ModbusTcpClient
from ast import literal_eval
import requests
import json
import time
import datetime
import csv
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-d","--device",help="Device ID")
args = parser.parse_args()
def pollData(devices):
items = []
client = ModbusTcpClient(host=devices['ip_address'],port=devices['port'])
connection = client.connect()
alarm = "NO ALARM"
for driver in devices['thresholds']['threshold_data']:
try:
address = literal_eval('0x0{}'.format(driver['hex_offset'].rstrip('H')) or 0)
response = client.read_holding_registers(address,10,unit=int(devices['slave_id']))
converted = response.registers[0] / int(driver['register_scale'])
bin8 = lambda x: ''.join(reversed([str((x >> i) & 1) for i in range(16)]))
try:
value = float(round(converted,2))
print(value)
if float(converted) < float(driver['low_critical'] or 0):
alarm = "LOW CRITICAL"
print('LOW CRITICAL')
elif float(driver['low_warning'] or 0) > float(converted) > float(driver['low_critical'] or 0):
alarm = "LOW WARNING"
print('LOW WARNING')
elif value > float(driver['high_warning'] or 0):
alarm = "HIGH WARNING"
print('High Warning')
elif value > float(driver['high_critical'] or 0):
alarm = "HIGH CRITICAL"
print('High Critical')
sendData(devices['device_id'],value,alarm)
except TypeError as e:
print(e)
timestamp = str(datetime.datetime.Now())
items.append(round(converted,2))
average = average_list(items)
maximum_value = max(items)
minimum_value = min(items)
# Send data to threshold and save only every 15 minutes
send_poll(devices['device_id'],round(converted,2),driver['address'],minimum_value,maximum_value,average)
with open('/home/xxx/Documents/csv' + csv_name,'a+',newline='') as f:
driver_writer = csv.writer(f,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL)
driver_writer.writerow([timestamp,devices['device_id'],devices['slave_id'],alarm])
except ValueError as e:
print(e)
continue
return items
def sendData(device_id,alarm_value,alarm_status):
r = requests.post('http://xxx/store-alarm',data={
'device_id': device_id,'alarm_value': alarm_value,'alarm_status': alarm_status
})
def send_poll(device_id,modbus_address,min_value,max_value,average_value):
r = requests.post('http:/xxx','modbus_address': modbus_address,'value': value,'min_value': min_value,'max_value': max_value,'average_value': average_value,})
print(r)
def average_list(lst):
return sum(lst) / len(lst)
while True:
try:
devices = requests.get('http://xxxx'.format(str(args.device))).json()
data = pollData(devices)
time.sleep(3)
except Exception as e:
print(e)
continue
我在这里可以做些什么使它们彼此平行运行?谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)