使用不同的crontab命令运行单个python脚本

问题描述

我正在尝试创建一个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

重新启动cron 1分钟后,没有创建任何日志文件

以下是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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...