PM2 заставляет мою программу постоянно перезагружаться, затопляя меня в электронных письмах - PullRequest
0 голосов
/ 09 марта 2020

Я создал python программу для мониторинга моих процессов из текстового файла и отправки электронного письма, если они не возвращают PID. Это сработало нормально, но когда я настроил его в pm2, он начал постоянно перезагружаться, что наводнило меня на электронные письма. То есть в течение 60 секунд pm2 ls сообщил о 60 перезапусках для моего сервиса, и я получил об этом множество электронных писем, в которых говорилось, что процесс не работает.

Вот код для моего сервиса:

#monitor.py

import subprocess

class ProcessCheck():

  def name(self):
      return "ProcessCheck"

  def check_process(name):
      child = subprocess.Popen(['pgrep', '-f', name], stdout=subprocess.PIPE, shell=False)
      response = child.communicate()[0]
      pid = response.split()
      if len(pid) == 0:
          return False
      else:
          print("PID is %s" % pid)
          return True

#alertService.py
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_email(app_list):
    sender_email = "test@test.com"
    receiver_email = "test@test.com"

    message = MIMEMultipart("alternative")
    message["Subject"] = "No PID found"
    message["From"] = sender_email
    message["To"] = receiver_email

    message_construct = "this is a test message for failed {}"
    message_text = message_construct.format(app_list)

    message.attach(MIMEText(message_text, "plain"))
    message.attach(MIMEText(message_text, "html"))


    try:
        smtpObj = smtplib.SMTP(<smtp url>, <smtp port>)
        smtpObj.ehlo()
        smtpObj.sendmail(sender_email, receiver_email, message.as_string())
        smtpObj.quit()
        print("Successfully sent email.")

    return null

#app.py
from monitor import *
from alertService import *
import os.path


down_apps = []
sendEmail=False

if os.path.exists("list.txt"):
    list_file = open("list.txt", "r")

    for line in list_file:
        appName = line.strip()
        if ProcessCheck.check_process(appName) is False:
            print("Unable to find PID for %s. Sending email alert" % appName)
            down_apps.append(appName)
            sendEmail = True
        else:
            print("Found PID for %s" % appName)
    list_file.close() 
else:
    print("No process list detected") 


if sendEmail == True:
    print("Sending email for downed processes")
    send_email(down_apps)
else:
    print("All processes are up at this time")


Моя конфигурация pm2:

{
  "apps" : [
    {
      "name": "processmon",
      "script": "/home/user1/test/processmon/monitor/app.py",
      "pid_file": "~/test/processmon/bin",
      "out_file": "~/test/processmon/logs/processmon.log",
      "error_file": "~/test/processmon/logs/processmon.log",
      "log_date_format" : "YYYY-MM-DD HH:mm:ss"
    }
  ]
}

Который я, в свою очередь, использую в pm2 start ./pm2_config.json. Я не уверен, почему он перезапускается снова и снова - я не знаю, связано ли это с самим кодом или с конфигурацией pm2. Логи pm2 не показывают ошибок, только ожидаемый вывод из кода. Все, что я хочу, это чтобы он запускался раз в час, и я знаю, что могу сделать это с помощью pm2 cron. Однако, прежде чем я это реализую, мне нужно разрешить этот постоянный перезапуск. Это возможно?

...