Запускать скрипт Python после каждых X секунд, взятых пользователем - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующий код Python:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import requests
import sys
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

#Function to get the health of the cluster
def getClusterHealth():
    try:
        response = requests.get('http://127.0.0.1:2379/health')
        data = response.json()
        if data['health']=="true":
            print("Cluster is healthy")
            getClusterMetrics()
        elif data['health']!="true":
            print ("Cluster is not healthy")
            sendEmail()
    except requests.exceptions.ConnectionError as e:
        print e
        print("Cluster is down")
        sendEmail()

#Function to get the netrics of the cluster
def getClusterMetrics():
    try:
        response = requests.get('http://127.0.0.1:2379/metrics')
        with open('clusterMetrics.txt','w') as f:
            f.write(response.text)
            f.close()
            print("Cluster Metrics saved in file: clusterMetrics.txt")
    except requests.exceptions.ConnectionError as e:
        print e
        sendEmail()

#Function to send emails in case of failures
def sendEmail():
    msg = MIMEText("etcd Cluster Down Sample Mail")
    sender = "etcd Cluster - 10.35.14.141"
    recipients = ["sample@email.com"]
    msg["Subject"] = "etcd Cluster Monitoring Test Multiple ID"
    msg['From'] = sender
    msg['To'] = ", ".join(recipients)
    s = smtplib.SMTP('localhost')
    s.sendmail(sender,recipients,msg.as_string())
    s.quit()

if __name__ == "__main__":

    if(len(sys.argv) < 2):
        print("Usage : python etcdMonitoring.py [health|metrics]")
    elif(sys.argv[1] == "health"):
        getClusterHealth()
    elif(sys.argv[1] == "metrics"):
        getClusterMetrics()

Я хочу запустить весь сценарий X секунд, взятых в качестве ввода от пользователя. Однако, используя этот вход, я хочу сделать некоторые функции, основанные на таймере, в моих функциях. Он должен показывать вывод / делать определенные вещи, как я хочу (здесь не могу показать код), но внутренние функции будут работать для кратных входных данных, данных пользователем. Например, если введено значение 30, сценарий должен запускаться каждые 30 секунд, но я должен иметь возможность проверять работоспособность кластера каждые две минуты.

1 Ответ

0 голосов
/ 29 июня 2018

Я столкнулся с такой проблемой некоторое время назад, просто поместите код, который вы хотите выполнять каждые X секунд, в функцию, затем используйте поточный модуль python, чтобы запустить его как поток, но не забудьте закрыть поток использование thread.cancel() или thread.exit() перед закрытием программы (использование atexit или ваша собственная реализация) в качестве функции будет продолжаться, если вы этого не сделаете.

import atexit
import threading
X = input("Repeat code every ? sec")
def code(X):
  thread = threading.Timer(float(X), code)
  thread.start()
  '''
  your
  code
  '''
def exit():
  thread.cancel() #or thread.exit()
atexit.register(exit)

Подробнее:
Запускать определенный код каждые n секунд
Как закрыть нить изнутри?

...