Запуск одного скрипта python с разными командами crontab

#python-3.x #cron #pymodbus

#python-3.x #cron #pymodbus

Вопрос:

Я пытаюсь создать один скрипт python, который должен выполняться в нескольких экземплярах непрерывно параллельно друг другу в фоновом режиме.

Я попытался использовать crontab в ubuntu 20.04 и получил следующее

 * * * * * python3 ~/Documents/xxx/pollingservice.py -d 185 > /tmp/log 2>amp;1

1 * * * * python3 ~/Documents/xxx/pollingservice.py -d 186 > ~/Documents/logs 2>amp;1

1 * * * * python3 ~/Documents/xxx/pollingservice.py -d 186 > ~/Documents/logs-186 2>amp;1

1 * * * * python3 ~/Documents/xxx/pollingservice.py -d 187 > ~/Documents/logs-187 2>amp;1
  

По сути, я хочу запустить этот единственный скрипт с несколькими аргументами. что они делают, так это извлекают данные с устройства с использованием протокола modbus и сохраняют их в файле csv. Однако кажется, что cronjob не запущен, после 1 минуты перезапуска cron с помощью команды не создается ни одного файла журнала 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) amp; 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'],
                                        driver['address'],
                                        round(converted, 2),
                                        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, value, modbus_address, min_value, max_value, average_value):
    r = requests.post('http:/xxx', data={
        'device_id': device_id,
        '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
  

могу ли я что-нибудь сделать здесь, чтобы заставить их работать параллельно друг другу? Спасибо!